Передача значений в ko.computed в Knockout JS

Я немного работал с 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 не определен (я тоже пробовал с "Фирмой"), если я изменяю:

var filter = id;     TO      var filter = 1;

Работает нормально,

Итак... Как вы передаете значение ko.computed? Это не должен быть идентификатор, это также может быть объект Firm и т.д.

Ответы

Ответ 1

Каждая фирма действительно должна содержать список клиентов, но вы можете использовать регулярную функцию, я думаю, и передаю ей фирму:

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

Ответ 2

Нокаут не позволяет передавать что-либо вычислительной функции. Это не то, для чего. Вместо этого вы можете просто использовать регулярную функцию, если хотите.

Другой вариант - иметь данные уже в наборе данных, на котором вы сделали первый файл foreach. Таким образом, вы не используете $parent.getClients, но больше похожи на $data.clients.