【问题标题】:Knockout JS make only one property of a complex array of objects observableKnockout JS 只使复杂对象数组的一个属性可观察
【发布时间】:2016-04-25 07:26:06
【问题描述】:

我正在使用 $.getJson 从服务器调用 (C#) 构建 observableArray。我的数组是从复杂对象的列表中构建的。复杂对象具有简单属性和数组属性。我只想使我的对象的一个​​属性(布尔值)可观察,但我仍然希望能够从 UI 访问其他属性(但是其他属性不会改变,所以我不希望它们是可观察的)。目前我只是从我从服务器获得的数据中填充我的 observableArray。有没有办法只创建一个属性的可观察对象???

function viewModel()
{
        var self = this;
        self.documents = ko.observableArray();

        $.getJSON("/getdocuments", function (data) {
            return self.documents(data);
        });

}

    ko.applyBindings(new viewModel());

【问题讨论】:

  • 是的,只要一个属性是可观察的。没有任何代码,很难比这更具体。
  • 我刚刚发布了我如何创建我的数组。我看不到在哪里可以将其属性之一设置为可观察的
  • 现在,您的所有属性都不是可观察的。只需遍历data 数组并添加一个可观察对象并将其设置为您想要的任何属性。或者,使用映射插件。

标签: javascript c# arrays knockout.js


【解决方案1】:

你可以这样做:

  1. 添加单独的对象构造函数,该函数将构建具有您需要的可观察属性的每个对象:

    var ObjectModel = function(config) {
        this.prop1 = config.prop1;
        ...
        this.propO = ko.observable(config.propO);
    }
    
  2. 在您成功的 ajax 回调中迭代您获得的对象配置并将它们提供给该对象构造函数,然后添加到您的主视图模型中的数组中:

    $.getJSON("/getdocuments", function (data) {
        var arr = [];
    
        data.forEach(function(objectCfg){
            arr.push( new ObjectModel(objectCfg) );
        })
        self.documents( arr );
    }
    

【讨论】:

  • 感谢您为我指明了正确的方向。我完全按照你说的做了,只是我创建了一个函数来添加我的 observable。
【解决方案2】:

正如 Nikolay 所说,只是我将此函数用作我的数组的管道。

var addProperty = function(inObject)
{
    inObject.IsFav = ko.observable(inObject.IsFavorite);
    return inObject;
}


$.getJSON("/getdocuments", function (data) {
var arr = [];

data.forEach(function(objectCfg){
    arr.push( addProperty(objectCfg) );
})
self.documents( arr );

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2016-02-18
    • 2016-01-21
    • 2015-01-17
    • 1970-01-01
    • 2014-10-23
    • 2014-06-22
    相关资源
    最近更新 更多