Привязка модели представления к списку

Я тестирую одностраничное приложение (SPA) и функции MVVM пользовательского интерфейса Kendo, но у меня возникают проблемы с привязкой Viewmodel к списку, который является содержимым одной из страниц...

Что у меня есть до сих пор:

<div id="app">
    <button data-bind="click: gotopage1">Page 1</button>
    <button data-bind="click: gotopage2">Page 2</button>
    <button data-bind="click: gotopage3">Page 3</button>
</div>

<script id="page1" type="text/x-kendo-template">
    <ul id="listView1" data-bind="source: photossource"></ul>
</script>

<script id="page2" type="text/x-kendo-template">
    //content of page 2
</script>

<script id="page3" type="text/x-kendo-template">
    //content of page 3
</script>

<script id="layout" type="text/x-kendo-template">
    <header></header><section id=content></section><footer></footer>
</script>

<script type="text/x-kendo-template" id="templatelistitem">
    <div class="item">
        <img data-bind="attr: { src: this }" />
    </div>
</script>
<script>
    var set1 = new Array();
    var set2 = new Array();
    var set3 = new Array();

    //fill the arrays... they are just strings to put on the `src` attribute of the `img`

    var appViewModel = new kendo.observable({
        gotopage1: function () {
            router.navigate("/");
    },
        gotopage2: function () {
            router.navigate("/page2");
    },
        gotopage3: function () {
            router.navigate("/page3");
    }
    });
    kendo.bind($("#app"), appViewModel);

    var pageViewModel = new kendo.observable({
        photossource: set1
    });

    var page1 = new kendo.View("#page1");
    var page2 = new kendo.View("#page2");
    var page3 = new kendo.View("#page3");

    var layout = new kendo.Layout("#layout");

    var router = new kendo.Router();

    router.route("/", function () {
        pageViewModel.photossource = set1;
        layout.showIn("#content", page1);
    });

    router.route("/page2", function () {
        pageViewModel.photossource = set2;
        layout.showIn("#content", page2);
    });

    router.route("/page3", function () {
        pageViewModel.photossource = set3;
        layout.showIn("#content", page3);
    });

    $(function () {
        router.start();
        layout.render($("#app"));
        layout.showIn("#content", page1);
    });

    $(document).ready(function () {
        $("#listView1").kendoListView({
            template: kendo.template($("#templatelistitem").html())
        });
        kendo.bind($("#listView1"), pageViewModel);
    });
</script>

Мне нужно привязать pageViewModel к listview1 страницы1. Этот pageViewModel будет общим для 3 страниц.

Это дает мне следующую ошибку:

Uncaught TypeError: Невозможно прочитать свойство 'parent' неопределенного в
kendo.web.min.js:12

Мои основные вопросы:

  • Как привязать модель представления к списку?

  • Мне нужно установить DataSource списка?

  • Как сослаться на photossource в шаблоне элемента списка?


person amp    schedule 13.04.2013    source источник


Ответы (2)


Вот решение JSFiddle без исключения, я считаю, что функциональность соответствует вашим ожиданиям.

Я изменил довольно мало вещей, и я не говорю, что все изменения необходимы, но, надеюсь, этот пример приведет вас к окончательному решению.

1) представления из шаблона делается по-другому. (Я сделал жесткий код.)

 var index = new kendo.View('index'); 

2) список для использования MVVM должен быть создан следующим способом

3) как уже упоминалось, вы должны использовать model.set(key,value) с вашими наблюдаемыми

pageViewModel.set("photossource", set1) 

4) следите за порядком инициализации элементов управления

person Vojtiik    schedule 17.12.2013

Использование Kendo UI View практически устраняет необходимость вызова kendo.bind. Рекомендуемый способ — назначить ViewModel представлению. . После этого вы можете заполнить поле источника фотографий, когда это необходимо. Кстати, любые операции над моделью представления должны выполняться с помощью методов set и get.

person Petyo Ivanov    schedule 16.12.2013