【问题标题】:knockoutjs how to call computed to internal object?knockoutjs 如何调用计算到内部对象?
【发布时间】:2014-06-13 09:05:18
【问题描述】:

我已经将 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" />

computed 在初始化期间只调用一次。如何让它为 Json 属性更改或一直调用计算?

【问题讨论】:

  • 你必须让他们observable
  • 是的,我有 self.globalSettings = ko.observable(globalSettings);但它不适用于内部属性
  • 您需要将该对象转换为带有可观察对象的对象,然后查看映射插件
  • @a3code them 我指的是globalSettings的属性

标签: knockout.js knockout-3.0


【解决方案1】:

猜测,但原则上不应该“注册” 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() 就会发生变化,并且计算得到触发

【讨论】:

  • ko 不能那样工作。可观察的 globalSettings 不会在其属性更新时通知
  • 也许你对 SettingsModel.globalSettings.extend({ notify: 'always' }); -- knockoutjs.com/documentation/observables.html 在底部“强制 observables 通知”
【解决方案2】:

您必须使用mapping plugin 或像这样创建属性observables:

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;
            });
};

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2021-10-19
      • 2019-06-06
      相关资源
      最近更新 更多