У меня есть observableArray, который выглядит примерно так:Фильтрация многомерный Нокаут observableArray с ko.utils.arrayFilter()
this.menuItems = ko.observableArray([
{ name: "level1", subItems: [
{ name: "level1-1" },
{ name: "level1-2" }
] },
{ name: "level2" },
{ name: "level3", subItems: [
{ name: "level3-1" },
{ name: "level3-2", subItems: [
{ name: "level3-2-1" }
] },
] },
{ name: "level4" }
]);
Это визуализирует меню навигации многоуровневый. Таким образом, некоторые элементы могут иметь subItems, другие - нет. И количество уровней неизвестно.
Теперь у меня есть вход для фильтрации, чтобы фильтровать эти вещи.
var self = this,
menuFilter = ko.observable(""),
filter = menuFilter().toLowerCase();
if (filter === "") {
return self.menuItems();
} else {
return ko.utils.arrayFilter(self.menuItems(), function (item) {
if (item.name.toLowerCase().indexOf(filter) !== -1) {
return true;
}
});
}
Это прекрасно работает для элементов верхнего уровня, но я не уверен, что лучший путь к петле через self.menuItems().subItems
, а затем затем следующий уровень, и следующий, и т.д.
Любые идеи?
Редактировать: Я только что создал этот скрипт JS и, похоже, работает. Теперь я должен выяснить, как это происходит в моем [чуть более сложном] приложении.
редактировать (еще раз): Мой последний вопрос в том, что верхний уровень не имеет никакой информации, поэтому я должен начать с .children
, который не работает.
Является ли точка с запятой в конце строки декларации 'menuFilter' запятой? Вы создаете 'filter' глобальную переменную, которая может быть не такой, какой вы хотите. – bdesham
Хорошая находка. Это была просто опечатка. И это все в объекте namespace'd. Я не использовал некоторые вещи для простоты. – dmathisen
ОК. Какой выход вы хотите от своей функции фильтрации? Вы хотите сохранить иерархическую структуру, чтобы сохранить все предки соответствующих элементов? Или вам нужен ровный список всех совпадений, независимо от того, как они были вложены в исходное дерево? – bdesham