0

我将 knockoutjs 绑定到 JSON 对象

var SettingsModel = function(globalSettings) {
    var self = this;
    if  (globalSettings == null)
    {
         globalSettings = {"v1":null,"v2":null};                  
    }
    self.globalSettings = ko.observable(globalSettings);
    self.v3 = ko.computed(function(){
                    var dd = self.globalSettings().v1;
                    var dd1 = self.globalSettings().v2;
                    return self.globalSettings().v1 * 3;
            });
};

<input type="text" data-bind="value: globalSettings().v1" 
       id="MStartTime" placeholder="Choose date" class="form-control" />

计算在初始化期间仅调用一次。如何使其适用于 Json 属性已更改或一直调用计算?

4

3 回答 3

0

您必须observable使用映射插件或像这样创建属性:

var SettingsModel = function(globalSettings) {
    var self = this;
    if  (globalSettings == null)
    {
         //create observables here
         globalSettings = {"v1":ko.observable(null),"v2":ko.observable(null)};
    }
    self.globalSettings = ko.observable(globalSettings);
    self.v3 = ko.computed(function(){
                    var dd = self.globalSettings.v1(); //notice the parenthesis
                    var dd1 = self.globalSettings.v2();
                    return self.globalSettings.v1() * 3;
            });
};
于 2014-06-13T09:22:58.353 回答
0

如果 gobalSettings 对象难以更改为可观察对象等,您可以使用虚拟可观察对象来解决问题,并notifySubscribers在对象发生变异时触发它

http://jsfiddle.net/5gVFK/2

于 2014-06-13T10:49:21.683 回答
0

疯狂的猜测,但原则上不应该“注册” self.globalSettings() 来监听它吗?喜欢 :

self.v3 = ko.computed(function(){

                self.globalSettings();
                var dd = self.globalSettings().v1;
                var dd1 = self.globalSettings().v2;
                return self.globalSettings().v1 * 3;
});

所以每次像 globalSettings().v1 这样的属性发生变化时,观察到的 globalSettings() 都会发生变化,并且计算得到触发

于 2014-06-13T09:13:43.567 回答