2015-05-20 59 views
0

我有一个正在填充数据的MVC表。每行数据都有附加在其上的数据的辅助列表。我试图将第一个值从第二个列表中提取出来,并将该字段填充到表格中。将计算函数的对象传递给对象

问题是在运行时由于某种原因调用函数时,头对象未定义。 ko循环在Header对象上循环,而Detail对象是我需要的数据。报头和细节都令

这里的孩子是HTML表劫函数调用:

<tbody data-bind="with: $root.Orders"> 
         <!-- ko foreach: OrdersList --> 
         <!-- ko with: Header --> 
         <tr>         
          <td class="text-left" style="padding: 2px !important;"><span id="localPO" data-bind="text: $root.SubsetNumber()"></span></td>         
         </tr> 
         <!-- /ko --> 
         <!-- /ko --> 
        </tbody> 

这里是KO功能:

vmHomeIndex.SubsetNumber = ko.computed(function (header) { 
      var details = header.$parents.Details; 
      var poNumber = 1; 
      return poNumber; 
     }, vmHomeIndex); 

所以我的问题是,为什么头未定义?

+0

请发布更多vmHomeIndex的。 – McCroskey

回答

2

header未定义,因为计算的observable的评估函数永远不会传入任何参数。

您可以通过将SubsetNumber计算到vmHomeIndex.OrdersList中的每个项目并参考当前项目的详细信息来解决此问题。

或者,您也可以调用一个函数并通过Header的父项。例如:

vmHomeIndex.getSubsetNumber = function (order) { 
    var header = order.Header; // example to get header 
    var details = order.Details; // then to get details 
    var poNumber = 1; 
    return poNumber; 
}; 

然后更改此代码:

data-bind="text: $root.SubsetNumber()" 

若要改为传中Header的父母与$parent在这种情况下:

data-bind="text: $root.getSubsetNumber($parent)" 
+0

这超出了未定义的标题,但它也阻止我使用$父母备份到父对象。有没有办法解决$数据如何发送的问题? – Rafiki

+0

@ChadBozeman你可以通过'$ parent'来代替。查看更新的答案。 –

1

传入计算的observables的匿名函数不带参数。因此,当你使用header作为参数定义的函数被Knockout调用时,参数是未定义的。

另外,请注意,正如书面所述,您的函数实际上从不会对细节的值做任何事情。话虽这么说,如果你要访问的头在计算观察到的,用它做什么,你可以做到以下几点:

vmHomeIndex.SubsetNumber = function(header) { 
    return ko.computed(function() { 
      var details = header.$parents.Details; 
      var poNumber = 1; 

      /* Do some magic here with Details to generate a poNumber */ 

      return poNumber; 
    }, vmHomeIndex); 
} 

然后,您可以做参考吧:

<span data-bind="text: $root.SubsetNumber($data)"></span> 

在在这种情况下,SubsetNumber是一个返回observable的函数。如果您只是从SubsetNumber中返回一个值,那么如果Details视图模型中的任何内容发生更改,那么跨度将不会更新。