IF语句中的Knockout绑定函数

时间:2017-05-26 13:47:22

标签: javascript asp.net-mvc knockout.js binding

我需要使用位于视图/页面循环中的对象的值从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语句中使用函数?

1 个答案:

答案 0 :(得分:0)

这里的问题是&#34;绑定上下文&#34;。先把事情做好。

  

修改

     

我刚注意到方法FindDeductibleValue()收到了   除了当前迭代的项目之外的东西,比如淘汰赛   自动。其中的代码似乎有点奇怪。你能   请发布您正在使用的完整视图模型?我不是   确信有足够的背景来正确回答这个问题。

  1. 如果深度或模式发生变化,我会使用$parents数组而不是$root

  2. 你不需要在你的绑定中调用你的观察者,淘汰赛会为你做这件事。 <!-- ko foreach: ExtendedItems -->代替<!-- ko foreach: ExtendedItems() -->

  3. 您遇到的主要错误是绑定上下文问题,从而在循环内调用该方法时,您基本上位于viewmodel的子上下文中。遗憾的是,JavaScript无法告诉您这一点。但它告诉你这个问题。子项目没有Value属性。为了解决这个问题,你需要绑定到正确的上下文我相信代码将是: $parents[0].FindDeductibleValue.bind(null, $parent.Provider())