【问题标题】:knockout observable with inheritance可通过继承观察到的淘汰赛
【发布时间】:2012-10-22 02:37:02
【问题描述】:

我的基类中的 observables 有问题。 查看this fiddle 以查看问题。

我会解释我要做什么。

我有一个我继承的视图模型的基类。 这个基类包含可观察的属性。

我创建了继承类的多个实例并将值分配给可观察对象,然后为所有实例注册的值是最后一次分配的值。

下面的代码解释了我的意思。

var vm = function () {
    var test = ko.observable();
    return {
        test: test
    }
};

var subvm = function () {

};

subvm.prototype = new vm();
subvm.prototype.constructor = subvm;
subvm.prototype.parent = vm.prototype;    

var testvm1 = new subvm();
var testvm2 = new subvm();


ko.applyBindings(testvm1, $('#div1').get(0));
ko.applyBindings(testvm2, $('#div2').get(0));

testvm1.test('Value for object 1');
testvm2.test('Value for object 2');

​ 创建的视图模型绑定到以下 html:

<div id="div1">
    <span data-bind="text: test">test1</span>
</div>
<div id="div2">
    <span data-bind="text: test">test2</span>
</div>

我做错了什么是淘汰赛不支持吗?

我会为此提供任何帮助。

【问题讨论】:

标签: javascript knockout.js knockout-2.0 prototypal-inheritance


【解决方案1】:

您的继承模型是错误的。 subvm 的两个实例共享同一个 test 实例。

原型继承不能在父“类”中创建词法范围变量的唯一实例,除非您确保每次实例化子类对象时实际调用超类构造函数。

【讨论】:

  • 嗨 Alnitak,我很抱歉,但我是原型继承的新手。你能给我一个例子,说明我如何确保调用超类构造函数。我以为它是用 subvm.prototype = new vm(); 调用的。
  • 我也不知道怎么做对,但我能认出什么时候做错了。您当前的行使用对new vm()one 调用的结果填充subvmprototype,并且此时创建了您的(单个)可观察对象。当您随后调用new subvm() 时,它再也不会调用new vm() - 所有副本共享vm.test 中的可观察对象的单个副本。
猜你喜欢
  • 2013-03-12
  • 2023-03-11
  • 2014-11-05
  • 2012-09-08
  • 2012-07-07
  • 2015-01-25
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多