【问题标题】:Knockout bind function in IF statementIF 语句中的敲除绑定函数
【发布时间】:2017-10-27 10:43:54
【问题描述】:

我需要使用来自视图/页面循环中的对象的值从 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 读取属性 'Value' of null”。

我已将$parent.Provider() 替换为一个数字,以确保$parent.Provider() 不为空,但它不会更改我收到的错误。

难道不能这样在 IF 语句中使用函数吗?

【问题讨论】:

  • 哎呀!实际上,这行得通...在尝试绑定数据之前,我需要填写SelectedDeductibles。我在 ViewModel 中尝试该函数的地方已经填充了,但是当我尝试在视图/页面的 IF 语句中绑定它时它还没有填充。

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


【解决方案1】:

这里的问题是“绑定上下文”。不过先把事情结合起来。

编辑:

我刚刚注意到FindDeductibleValue() 接收的方法 除了当前迭代的项目之外的东西,比如淘汰赛 自动地。而且里面的代码似乎有点奇怪。你可以吗 请发布您正在使用的完整视图模型?我不是 确信这里有足够的上下文来正确回答问题。

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

  2. 你不需要在你的绑定中调用你的 observables,knockout 会为你做这件事。 &lt;!-- ko foreach: ExtendedItems --&gt; 而不是 &lt;!-- ko foreach: ExtendedItems() --&gt;

  3. 您遇到的主要错误是绑定上下文问题,当从循环中调用该方法时,您实际上处于视图模型的子上下文中。不幸的是,JavaScript 无法告诉您这一点。但它告诉你问题所在。子项没有 Value 属性。为了解决这个问题,您需要绑定到正确的上下文,我相信代码将是: $parents[0].FindDeductibleValue.bind(null, $parent.Provider())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多