我正在将JsonResult返回到我的观点,以便与淘汰赛一起使用。结果是带有嵌套列表的复杂列表,我希望将其转换为相关的淘汰模型。
我不知道如何为嵌套项目分配模型类型:
var TopViewModel = function () {
var self = this;
self.basketItems = ko.observableArray();
$.getJSON(myUrl, function (data) {
console.log(data);
$.map(data,
function (item) {
self.basketItems.push(new MyItemViewModel([item.Quote], item.ElementHere));
});
});
}
var MyItemViewModel = function (quote, elementHere) {
var self = this;
self.Quote = ko.observableArray(quote); // this should be of QuoteViewModel type - how to make it?
self.ElementHere = ko.observable(elementHere);
};
var QuoteViewModel = function (id, ref) {
var self = this;
self.Id = ko.observable(id);
self.Ref = ko.observable(ref);
self.showDiv = ko.observable(false);
self.toggleDiv = function (item) {
console.log('Toggled Div window');
self.showDiv(!self.showDiv());
}
}
如何将QuoteViewMoel类型赋予self。在MyItemViewModel中引用observable?
答案 0 :(得分:0)
您将带有一个项目的数组传递给MyItemViewModel
:
new MyItemViewModel([item.Quote], /* ... */)
这意味着quote
构造函数中的MyItemViewModel
是一个length
1
的数组。
从您QuoteViewModel
的外观来看,我猜它的意思是代表一个引用。因此,你可以(a)使用常规的observable而不是在数组中包装东西,或者(b)将数组中的每个项转换为viewmodel。
var MyItemViewModel = function (quote, elementHere) {
// No longer an array
this.Quote = ko.observable(new QuoteViewModel(quote.Id, quote.Ref));
};
new MyItemViewModel(item.Quote, /* ... */); // No longer wrapped in an array
这使得每个MyItemViewModel
都有一个,可观察的 QuoteViewModel
。
如果确实需要Quote
在数组中,则必须在每个项目上包含构造函数调用:
// This is the snippet from example (A) wrapped in a function
var quoteViewModelFromData = function(quote) {
return new QuoteViewModel(quote.Id, quote.Ref);
}
var MyItemViewModel = function (quotes, elementHere) {
this.Quotes = ko.observableArray(quotes.map(quoteViewModelFromData));
};
new MyItemViewModel([item.Quote], /* ... */);
我建议更改一些名称和数据结构。它应该是item.Quotes
吗?那应该是一个阵列吗?也:
CapitalizedNames
如果item.Quote
已经是一个数组,那么您不应该在[]
来电MyItemViewModel
内包装它。