绑定到同一个knockout observable属性的两个控件会导致错误

时间:2012-05-28 15:06:33

标签: knockout.js knockout-2.0

我正在尝试编写一些UI,允许用户通过文本框输入数字或从下拉菜单中选择一个选项。

我在http://jsfiddle.net/unklefolk/PNQeR/2/

制作了一个简化的jsFiddle

如你所见:

  • 选择“数字”时,您可以在文本框中输入文字。
  • 当选择“选项”时,您可以从下拉列表中选择以下两个选项之一

文本框和下拉列表 BOTH 绑定到ItemValue中项目的viewModel属性。虽然代码似乎正在工作,但我收到了错误。如果您在Chrome中启动调试窗口,则在更改第一个下拉列表时会出现错误:

  

未捕获的TypeError:对象0没有方法'ItemName'

我相信这发生在ItemText dependentObservable(又名计算)中。

    this.ItemText = ko.dependentObservable(function () {
        return _isItemAConstant() === 'true' ? this.ItemValue() : this.ItemValue().ItemName();
    }, this);

显然,在数值'0'上调用ItemName()函数会导致错误。

我该怎么做才能发生此错误?我的设计是将两个控件绑定到同一个可观察的基本错误吗?

1 个答案:

答案 0 :(得分:1)

在将项目设置为具有ItemName属性的对象之前,将_isItemAConstant更改为false。一旦设置它,您的dependentObservable就会运行并尝试评估不存在的ItemName()observable。您可以检查是否存在ItemName属性,或使用throttle extender延迟计算,直到进行所有更改:

this.ItemText = ko.dependentObservable(function () {
    return _isItemAConstant() === 'true' ? this.ItemValue() : this.ItemValue().ItemName();
}, this).extend( { throttle: 1} );

this.ItemText2 = ko.computed(function() {
    return this.ItemValue().ItemName ? this.ItemValue().ItemName() : this.ItemValue();
}, this);