3

Knockoutには、いくつかのJSONオブジェクトを含むobservableArrayがあります。各JSONオブジェクトの下には、監視可能である必要があるネストされた配列があります。

Knockoutは、observableArray内の各JSONオブジェクトにネストされた配列を監視できません。

observableArrayにすでにネストされている配列をマップすることは可能ですか?

これは、observableArray内の1つのJSONオブジェクトの例です

注:「attributeValues」配列を監視可能にする必要があります。

{
    "attribute": {
        "id": 6,
        "name": "Some attribute name",
        "typeID": 5
    },
    "type": {
        "id": 5,
        "typeName": "list"
    },
    "attributeValues": [{
        "id": 10,
        "attributeID": 6,
        "value": "Some attribute value",
        "chosen": false
    }, {
        "id": 11,
        "attributeID": 6,
        "value": "Another attribute value",
        "chosen": false
    }, {
        "id": 12,
        "attributeID": 6,
        "value": "Third attribute value",
        "chosen": false
    }]
}

現在使用しているコードは次のとおりです。

$.ajax({
    type: 'GET',
    url: '/JsonService',
    success: function (data) {
        avm.attributes(data.allAttributes);
    },
    dataType: 'json',
    traditional: true
});

function attributeViewModel() {
    var self = this;

    self.attributes = ko.observableArray([]);
}

var avm = new attributeViewModel();
ko.applyBindings(avm);
4

1 に答える 1

5

1つの解決策は、属性配列の各項目をラップするコンストラクター関数をもう1つ定義することです。この関数では、次の例に示すように、 attributeValues配列を監視可能として定義できます。

function AttributeValueViewModel (data) {
    var self = this;
    self.attribute = ko.observable(data.attribute);
    self.type = ko.observable(data.type);
    self.attributeValues = ko.observableArray(data.attributeValues);
}

function attributeViewModel() {
    var self = this;
    self.attributes = ko.observableArray([]);
    self.addList = function (list) {
        ko.utils.arrayForEach(list, function(item) {
            self.attributes.push(new AttributeValueViewModel(item));
        });
    };
}

var avm = new attributeViewModel();
ko.applyBindings(avm);
$.getJSON('url', function (list) { avm.addList(list); });
于 2012-10-03T18:53:26.350 に答える