【问题标题】:Passing values to ko.computed in Knockout JS在 Knockout JS 中将值传递给 ko.computed
【发布时间】:2012-06-05 01:51:00
【问题描述】:

我一直在使用 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对象等。

【问题讨论】:

  • Id 应该是你的 viewmodel 上的一个 observable。您应该只从计算中访问它。

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


【解决方案1】:

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

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

【讨论】:

  • 我不会接受这个建议 atm,但它是我将来会考虑的,感谢关于计算的答案。
  • 没问题。我的回答中有同样的建议,但另一个答案有例子。
【解决方案2】:

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

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)">

【讨论】:

  • 坦克友!!这正是我所需要的 :) 但我也要记住,我应该从一开始就将客户列在一个列表中。
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 2017-08-07
  • 2013-06-01
  • 1970-01-01
  • 2014-09-15
  • 2020-07-03
  • 2015-09-29
  • 2021-09-02
相关资源
最近更新 更多