Knockout将对象传递给计算函数

时间:2015-05-20 20:26:43

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

我有一个充满数据的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);

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

2 个答案:

答案 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视图模型中的任何内容发生更改,则不会更新范围。