【问题标题】:knockout observables within an object对象内的剔除 observables
【发布时间】:2016-04-21 04:32:27
【问题描述】:

我将尽我所能解释这一点。我在该对象中有一个名为 BaseForm 的对象,我有函数和淘汰赛 observables。我有一个名为Initialize 的函数,其中有一个对象,里面充满了ko observables。其中一个 observable 被称为 FormVisible 并被初始化为 true (FormVisible: ko.observable(true))。我还有一个名为OnClickRow 的函数。在此函数中,它将FormVisible 从真更改为假。我多次实例化BaseForm。当我调用OnClickRow 时,它只会影响最后一个实例化的对象。为什么会这样?我该如何解决?

这是我的代码:

function BaseForm() {
  var that = this;
  BaseForm.prototype.Initialize = function(model) {
    this.model = model;
    this.FormVM = {
      FormVisible: ko.observable(true)
    }
  }

  BaseForm.prototype.OnClickRow = function() {
    that.FormVM.FormVisible(false);
  }
}

this.base1 = new BaseForm();
this.base1.Initialize("new");

this.base2 = new BaseForm();
this.base2.Initialize("old");

this.base3 = new BaseForm();
this.base3.Initialize("other");

this.base1.OnClickRow();

这里是jsfiddle

【问题讨论】:

标签: javascript jquery knockout.js


【解决方案1】:

其实我已经想通了。这是一个很容易解决的问题。我将this.FormVM 更改为that.FormVM 并在OnClickRow 内将that.FormVM.FormVisible(false); 更改为this.FormVM.FormVisible(false)。我仍然不确定为什么这种方式有效,为什么另一种方式无效。因此,如果有人有解释,那就太好了。谢谢!

这是更新后的fiddle

【讨论】:

    【解决方案2】:

    您需要将原型配置移到构造函数之外,并将“that”更改为“this”:

    function BaseForm() {
        var that = this;
    }
    
    BaseForm.prototype.Initialize = function(model) {
        this.model = model;
        this.FormVM = {
            FormVisible: ko.observable(true)
        }
    }
    
    BaseForm.prototype.OnClickRow = function() {
        this.FormVM.FormVisible(false);
    }
    
    1. 原型继承链在“new”或 Object.create() 上调用。因此,您不应该在构造函数中声明原型方法,因为不能保证原型链已经初始化。

    2. 将这些方法移到构造函数之外意味着 'that' 将是未定义的,因此使用 'this' 指的是所需的对象。

    我建议您查看 Mozilla Javascript 文档,以增强您对自定义对象的了解。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript#Custom_objects

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      相关资源
      最近更新 更多