如何将自定义模型类型分配给knockout observable?

时间:2017-06-20 10:16:35

标签: knockout.js

我正在将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?

1 个答案:

答案 0 :(得分:0)

您将带有一个项目的数组传递给MyItemViewModel

new MyItemViewModel([item.Quote], /* ... */)

这意味着quote构造函数中的MyItemViewModel是一个length 1的数组。

从您QuoteViewModel的外观来看,我猜它的意思是代表一个引用。因此,你可以(a)使用常规的observable而不是在数组中包装东西,或者(b)将数组中的每个项转换为viewmodel。

(A)单引号

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

(B)使用引号数组

如果确实需要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内包装它。