我需要使用位于视图/页面循环中的对象的值从ViewModel获取值。
<!-- ko foreach: ExtendedItems() -->
<tr>
<!-- ko foreach: PriceGroups() -->
<!-- ko if: DeductibleAmount() === $root.FindDeductibleValue($parent.Provider()) -->
<td> --Content-- </td>
<!-- /ko -->
<!-- /ko -->
</tr>
<!-- /ko -->
我在ViewModel中有一个找到正确值的函数:
self.FindDeductibleValue = function (provider) {
return self.SelectedDeductibles.findObs('Provider', { Provider: provider }).Value();
}
当我从ViewModel调用它时,这个函数工作正常,但当我尝试在IF语句的视图/页面中使用它时,我得到“无法在viewModel.self.FindDeductibleValue读取null的属性'值'。
我已将$parent.Provider()
替换为数字,以确保$parent.Provider()
不为空,但它不会更改我收到的错误。
是否不能以这种方式在IF语句中使用函数?
答案 0 :(得分:0)
这里的问题是&#34;绑定上下文&#34;。先把事情做好。
修改强>
我刚注意到方法
FindDeductibleValue()
收到了 除了当前迭代的项目之外的东西,比如淘汰赛 自动。其中的代码似乎有点奇怪。你能 请发布您正在使用的完整视图模型?我不是 确信有足够的背景来正确回答这个问题。
如果深度或模式发生变化,我会使用$parents
数组而不是$root
。
你不需要在你的绑定中调用你的观察者,淘汰赛会为你做这件事。 <!-- ko foreach: ExtendedItems -->
代替<!-- ko foreach: ExtendedItems() -->
。
您遇到的主要错误是绑定上下文问题,从而在循环内调用该方法时,您基本上位于viewmodel的子上下文中。遗憾的是,JavaScript无法告诉您这一点。但它告诉你这个问题。子项目没有Value
属性。为了解决这个问题,你需要绑定到正确的上下文我相信代码将是:
$parents[0].FindDeductibleValue.bind(null, $parent.Provider())