将Observable添加到ObserableArray项

时间:2013-10-24 01:43:34

标签: javascript knockout.js knockout-mapping-plugin

我目前在扩展ObserableArray对象时遇到问题,因此它们具有额外的可观察属性。

我想做的是这样的事情:

ko.utils.arrayForEach(MyKnockoutManager.GetByModelKeyName('Catalog'), 
            function (CatalogItem) 
            {
                CatalogItem.IsSelected = ko.observable(false);
            });

然而,当然情况并非如此。

有没有办法将observables添加到obserableArray的对象?

1 个答案:

答案 0 :(得分:1)

要添加其他属性,您只需将其设置为

即可
CatalogItem.IsSelected = ko.obsrevable(false);

这将在您想要的对象上添加一个额外的属性。如果您尝试将其添加到每个对象上,那么为什么不在构造对象时添加它?

function catalogItemModel(item) {
    var self = this;
    self.Id = ko.observable(id);
    self.Name = ko.observable(name);
    self.someOtherPropertyLikeIsSelected = ko.observable(false);
}

var thisArray = ko.observableArray();
var thisData = [{ id: 1, name: 'Jim' }, { id: 2, name: 'Bob' }];

$.each(thisData, function (index, item) {
    new catalogItemModel(item);
});

使用模型可以确保传入的所有可观察对象之间的一致性。您还可以使用原型来在映射数据后添加函数,但我不认为这是您正在寻找的。

修改

我看到你所说的关于迭代项目以添加属性的内容,但它并不是你想要采取的正确方向。如果必须这样做,只需将代码调整为以下内容 -

var vm.CatalogItems = ko.observable(MyKnockoutManager.Items.slice());
ko.utils.arrayForEach(vm.CatalogItems(), function (CatalogItem) {
    CatalogItem.IsSelected = ko.observable(false);
});