我有一个充满数据的MVC表。每行数据都附有一个辅助数据列表。我正试图从第二个列表中提取第一个值并在表格中填充该字段。
问题是在运行时由于某种原因调用函数时未定义头对象。 ko循环在Header对象上循环,Detail对象是我需要的数据。标题和细节都是订单的子项
这是带有ko函数调用的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 :(得分: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)"
答案 1 :(得分:1)
传递给计算的观察者的匿名函数不参数。因此,当您使用头作为参数定义的函数由Knockout调用时,该参数是未定义的。
另外,请注意,正如所写,您的功能实际上从未对细节的价值做任何事情。话虽这么说,如果你想访问计算的observable中的标题并对它做一些事情,你可以执行以下操作:
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视图模型中的任何内容发生更改,则不会更新范围。