knockoutjs如何映射嵌套的observable数组

时间:2012-03-15 23:43:15

标签: knockout.js

我对以下代码提出了几个问题

  1. PromoTemplate中的TokenList是否为observableArray,数组中的每个项目发生了什么?他们会自动被包裹成可观察的吗?

  2. 所有绑定似乎都有效,我可以一直到令牌的值,但是当我修改输入中的数据时,它似乎没有通知其他绑定到的控件相同的属性,例如AttributeToken.Value。

    function AttributeToken(data) {
        this.Identifier = ko.observable(data.Identifier)
        this.DataType = ko.observable(data.DataType)
        this.Value = ko.observable(data.Value);
    }
    
    function PromoTemplate(data) {
        this.Identifier = ko.observable(data.Identifier);
        this.Name = ko.observable(data.Name);
        this.Content = ko.observable(data.Content);
        this.TokenList = ko.observableArray(data.Tokens);
        this.Sample;
    }
    
    function PromoTemplateViewModel() {
        // Data
        var self = this;
        self.promoTemplates = ko.observableArray([]);
    
    
        self.selectedPromoTemplate = ko.observable();
    
        // Init
        $.getJSON(promoTemplatesUrl, function (allData) {
            var mappedPromoTemplates = $.map(allData, function (item) { return new PromoTemplate(item) });
            self.promoTemplates(mappedPromoTemplates);
        });
    
    }
    
  3. json数据如下所示

    [{"Content":"<product><data price = \"100\" discountPercentage=\"{Percentage}\" startDate=\"{StartDate}\" ><\/data><\/product>","Description":null,"Identifier":"1","Name":"Percentage Promo","Tokens":[{"DataType":"double","Identifier":"{Percentage}","Value":"20"},{"DataType":"date","Identifier":"{StartDate}","Value":"10\/21\/2012"}]},{"Content":"<product><data price = \"250\" discountAmount=\"{DiscountAmount}\" startDate=\"{StartDate}\" ><\/data><\/product>","Description":null,"Identifier":"2","Name":"Dollar off Promo","Tokens":[{"DataType":"integer","Identifier":"{DiscountAmount}","Value":"5"},{"DataType":"date","Identifier":"{StartDate}","Value":"10\/21\/2012"}]}]
    

1 个答案:

答案 0 :(得分:2)

observableArrays不会自动生成所有可观察项目的所有属性。 observableArray只会在您操作数组本身(推送,弹出,切片等)或完全替换数组时通知订阅者。

因此,在您的情况下,您需要将data.Tokens映射到AttributeToken个实例,方式与映射整体数据的方式类似,或者使用类似mapping plugin的内容