2014-09-01 3 views
0

У меня есть представление о том, как работать с функцией поиска в реальном времени в Knockout.js. Но у меня есть новый вид сложного требования, чтобы конечный результат был бы выглядит как ниже ...Живой поисковый фильтр нокаутом js с вложенным уровнем

enter image description here

Когда пользователь щелкает на перечисленном из результатов поиска, он может иметь другой набор списка детей, которые должны иметь н 'количество сокращений!

Я пробовал использовать функцию прямого поиска в реальном времени. Я что-то потерял. Я не знаю, как загружать многоуровневые данные от Json и как сделать привязку в нокаут JS.

Любые идеи?

+0

http://jsfiddle.net/tyrsius/67kgm/ - это URL я начал. Но я не знаю, как загрузить вложенный уровень данных, поскольку я добавляю иллюстрации в свой вопрос. – Vasethvan

+0

возможно [это] (http://stackoverflow.com/questions/25564936/knockoutjs-recurring-array/25565664#25565664) рекурсия поможет –

+0

Самый простой пример для вложенности в [KO documentation] (http: // knockoutjs .com/документация/ненавязчивым-событийно-handling.html # живой пример вложенной-дети). Что касается JSON, используйте плагин [mapping plugin] (http://knockoutjs.com/documentation/plugins-mapping.html) – Tyblitz

ответ

0

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

Здесь я изменил ваш расчет, который фильтрует все поля в реальном времени.

self.filteredRecords = ko.computed(function() { 
    var idSearch = self.idSearch(), 
     nameSearch = self.nameSearch().toLowerCase(), 
     townSearch = self.townSearch(); 
    return ko.utils.arrayFilter(self.records(), function (r) { 
     return r.id.toString().indexOf(idSearch) !== -1 && 
      r.name.toLowerCase().indexOf(nameSearch) !== -1 && 
      (r.homeTown === townSearch || townSearch === ""); 
    }); 
}); 

http://jsfiddle.net/67kgm/127/