我对以下代码提出了几个问题
PromoTemplate中的TokenList是否为observableArray,数组中的每个项目发生了什么?他们会自动被包裹成可观察的吗?
所有绑定似乎都有效,我可以一直到令牌的值,但是当我修改输入中的数据时,它似乎没有通知其他绑定到的控件相同的属性,例如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);
});
}
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"}]}]
答案 0 :(得分:2)
observableArrays不会自动生成所有可观察项目的所有属性。 observableArray只会在您操作数组本身(推送,弹出,切片等)或完全替换数组时通知订阅者。
因此,在您的情况下,您需要将data.Tokens
映射到AttributeToken
个实例,方式与映射整体数据的方式类似,或者使用类似mapping plugin的内容