15

我一直在使用 MVC4 SPA 和 knockoutJs,

我的问题是我想将一个值传递给 ko.computed。这是我的代码。

<div data-bind="foreach: firms">
<fieldset>
    <legend><span data-bind="text: Name"></span></legend>
    <div data-bind="foreach: $parent.getClients">
        <p>
            <span data-bind="text: Name"></span>
        </p>
    </div>
</fieldset>
</div>

self.getClients = ko.computed(function (Id) {
    var filter = Id;
    return ko.utils.arrayFilter(self.Clients(), function (item) {
        var fId = item.FirmId();
        return (fId === filter);
    });
});

我只想将公司名称显示为标题,然后在其下方显示客户端。正在调用该函数,但 Id 未定义(我也尝试过使用“Firm”),如果我更改:

var filter = id;     TO      var filter = 1;

它工作正常,

所以...你如何将值传递给 ko.computed?它不需要是 Id,也可以是 Firm 对象等。

4

2 回答 2

19

每个公司确实应该包含一个客户列表,但是您可以使用我认为的常规函数​​并将其传递给公司:

self.getClientsForFirm = function (firm) {
    return ko.utils.arrayFilter(self.Clients(), function (item) {
        var fId = item.FirmId();
        return (fId === firm.Id());
    });
});

然后在 html 中, $data 是当前模型,在您的情况下是公司:

<div data-bind="foreach: $root.getClientsForFirm($data)">
于 2012-05-31T04:18:06.207 回答
8

Knockout 不允许您将任何内容传递给计算函数。那不是它的用途。如果您愿意,您可以在那里使用常规功能。

另一种选择是让数据已经在您执行第一次 foreach 的数据集中。这样,你就不用$parent.getClients了,而更像$data.clients.

于 2012-05-30T19:25:36.883 回答