0

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

我在http://jsfiddle.net/unklefolk/PNQeR/2/做了一个简化的 jsFiddle

如你看到的:

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

文本框和下拉列表都绑定ItemValue. viewModel尽管代码似乎可以正常工作,但我遇到了错误。如果您在 Chrome 中启动调试窗口,当您更改第一个下拉菜单时,您会收到错误消息:

未捕获的类型错误:对象 0 没有方法 'ItemName'

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

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

显然,该ItemName()函数是在导致错误的数值“0”上调用的。

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

4

1 回答 1

1

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

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);
于 2012-05-28T23:48:03.233 回答