我正在尝试编写一些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()
函数会导致错误。
我该怎么做才能发生此错误?我的设计是将两个控件绑定到同一个可观察的基本错误吗?
答案 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);