Передача значений в 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
.