Связывание данных, вложенное в JSON с помощью Knockoutjs - PullRequest
1 голос
/ 01 февраля 2012

У меня есть структура JSON, содержащая массивы массивов. У меня есть модель представления, которая определяет объекты с наблюдаемыми массивами, содержащими наблюдаемые данные, а затем вкладывает эти объекты в другие массивы и наблюдаемые.

Какой самый простой способ загрузить модель представления, содержащую вложенные наблюдаемые массивы, содержащие наблюдаемые данные?

Пример: http://jsfiddle.net/uyQb6/1/

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

Вы можете исследовать с помощью подключаемого модуля отображения, но объект параметров будет усложняться, поскольку при каждом обратном вызове create потребуется снова вызывать подключаемый модуль отображения, а затем добавлять любые зависимые объекты наблюдения, и было бы легче сделать все свойства наблюдаемыми.

Вы можете придерживаться своих конструкторов и использовать что-то вроде ko.utils.arrayMap, которая представляет собой простую функцию, которая перебирает массив и сопоставляет каждый элемент тому, что вы возвращаете из функции, которую вы предоставили.

Вот ваш пример с добавленными вызовами ko.utils.arrayMap: http://jsfiddle.net/rniemeyer/VUfSS/

0 голосов
/ 10 июня 2016

Обновление: если ваш вложенный список зависит от основного списка, это ваше решение, в противном случае решение @ rp-niemeyer будет лучшим.

Если я правильно понял, допустим, выу меня есть данные в формате JSON:

{
    appId: 1,
    appName: 'my app 1',
    modules:[
        {module1:1, moduleName: 'module 1'}, {module1:2, moduleName: 'module 2'}]
},
{
    appId: 2,
    appName: 'my app2',
    modules:[
        {module1:3, moduleName: 'module 3'}, {module1:4, moduleName: 'module 4'}]
}

Это будет ваша модель представления:

function myViewModel(){
    var self = this;
    self.appList = ko.observableArray(data);
    self.moduleList = ko.observableArray([]);

    // Set selectedApp in order to fill modulesList
    self.selectedApp = ko.observable();
    self.selectedApp.subscribe(function(v){
        // updates module list whenever selected app gets value.
        moduleList(v.modules);
    });
}

Я не тестировал ее, но уверен, что у вас есть идея.

...