knockoutjs如何调用计算到内部对象?

时间:2014-06-13 09:05:18

标签: knockout.js knockout-3.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" />

计算在init期间只调用一次。如何使它适用于Json属性被更改或只是一直调用计算?

3 个答案:

答案 0 :(得分:0)

狂野的猜测,但原则上不应该注册&#34;注册&#34; 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()会发生变化,计算结果会被触发

答案 1 :(得分:0)

您必须使用mapping plugin制作属性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;
            });
};

答案 2 :(得分:0)

如果gobalSettings对象很难改变为observables等,你可以解决使用虚拟observable的问题,并在对象变异时触发它notifySubscribers

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