javascript - Nested loops in Knockout.js with if:clause -
i having problem nested foreach statements in ko.
the following statements work fine on own when combine them inner 1 doesn't work , doesn't throw error either.
ideally inner join conditional have tried without if clause , still no luck.
experts have property array of expertroles assigned particular user. outer loop meant print expertroles , inner loop meant print experts match expert role of outer loop
1st foreach: works
<ul data-bind="foreach: expertroles"> <li class="expert ui-menu-item" role="menuitem" data-bind="attr: { 'data-cid': id }, text: name"> </li> </ul>
2nd foreach: works
<ul data-bind="foreach: experts"> <li class="expert ui-menu-item" role="menuitem" data-bind="attr: { 'data-cid': connectionid, 'title': username }"> <a href="javascript:void(0);" data-bind="text: username"></a> </li> </ul>
combined if clause: inner loop doesn't work, throws no error
<ul data-bind="foreach: expertroles"> <li class="expert ui-menu-item" role="menuitem" data-bind="attr: { 'data-cid': id }, text: name"> <ul data-bind="foreach: experts"> <li class="expert ui-menu-item" role="menuitem" data-bind="if: expertroles.indexof($parent.id) > 0, attr: { 'data-cid': connectionid, 'title': username }"> <a href="javascript:void(0);" data-bind="text: username"></a> </li> </ul> </li> </ul>
no if clause: inner loop doesn't work, throws no error
<ul data-bind="foreach: expertroles"> <li class="expert ui-menu-item" role="menuitem" data-bind="attr: { 'data-cid': id }, text: name"> <ul data-bind="foreach: experts"> <li class="expert ui-menu-item" role="menuitem" data-bind="attr: { 'data-cid': connectionid, 'title': username }"> <a href="javascript:void(0);" data-bind="text: username"></a> </li> </ul> </li> </ul>
edit:
let me add have tried container-less syntax (<!-- ko foreach:, <!-- ko if:
, etc)
this part of viewmodel, data gets updated signalr difficult me make fiddle. please, focus on they work on own.
var viewmodel = { users: ko.mapping.fromjs([]), expertroles: ko.mapping.fromjs([]) }; // experts subset of users viewmodel.experts = ko.computed(function () { return ko.utils.arrayfilter(this.users(), function (item) { return item.isexpert() === true; }); }, viewmodel);
edit 2:
with have managed make loops work. reason binding name
on outer li
causes inner loop stop working.
<ul> <!-- ko foreach: $root.expertroles --> <li class="expert ui-menu-item" role="menuitem" data-bind="attr: { 'data-cid': id }"> <span data-bind="text: name"></span> <ul> <!-- ko foreach: $root.experts --> <li class="expert ui-menu-item" role="menuitem" data-bind="attr: { 'data-cid': connectionid }"> <a href="javascript:void(0);" data-bind="text: username"></a> </li> <!-- /ko --> </ul> </li> <!-- /ko --> </ul>
when using foreach
in nested loop can access properties of parent model. experts
not property of item expertroles
. property of viewmodel
model. that's why doesn't work. try using $root
:
<ul data-bind="foreach: $root.experts"> <li class="expert ui-menu-item" role="menuitem" data-bind="if: $root.expertroles.indexof($parent.id) >= 0, attr: { 'data-cid': connectionid, 'title': username }"> <a href="javascript:void(0);" data-bind="text: username"></a> </li> </ul>
Comments
Post a Comment