【问题标题】:Adding Observable to an ObserableArray Item将 Observable 添加到 ObserableArray 项
【发布时间】:2013-11-02 12:57:55
【问题描述】:

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

我想做的是这样的:

ko.utils.arrayForEach(MyKnockoutManager.GetByModelKeyName('Catalog'), 功能(目录项) { CatalogItem.IsSelected = ko.observable(false); });

但是,当然不是这样的。

有什么方法可以将 observables 添加到 obserableArray 的对象中?

【问题讨论】:

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


    【解决方案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);
    });
    

    使用模型可确保传入的所有 observable 之间的一致性。您也可以使用原型在数据映射后添加函数,但我认为这不是您想要的。

    编辑

    我明白您所说的迭代项目以添加属性,但这并不是您想要采取的正确方向。如果您必须这样做,只需将您的代码调整为以下 -

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

    【讨论】:

    • 我在添加新属性时遇到了困难,因为我使用的是剔除映射插件。我尝试使用映射选项,但无法获得映射值。否则,事先构建模型将是最佳选择。
    • 我不太明白 - 只需覆盖映射并添加属性,或者完全按照您在问题中尝试的操作并遍历选项并添加属性。
    猜你喜欢
    • 2013-11-10
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多