2013-06-03 2 views
0

Я использую JsViews для отображения списка, но сначала передавая список через вспомогательную функцию следующим образом:JsViews: данные сшивание с функцией хелперов

<ul> 
    {^{for ~filter(list, 'xyz')}} 
    <li>...</li> 
    {{/for}} 
</ul> 

Где filter создает новый список, основанный на list с только некоторые из исходных элементов, основанные на критериях фильтрации. Беда в том, когда я обновляю list:

$.observable(data.list).insert(list.length, { ... }); 

{^{for ...}} не получает повторную оценку. Тем не менее, если удалить фильтр, изменяя {^{for ...} к этому:

{^{for list}} 
    ... 
{{/for}} 

Тогда все работает, как ожидалось. Есть ли способ достичь того, что мне нужно? Кажется, JsViews должен быть способен делать то, что я хочу, потому что этот ответ достаточно схож: JsViews: Converter before helper function in data-link.

+0

Теперь мне интересно: есть ли способ заставить это работать, или мне придется аннулировать часть представления, чтобы заставить его повторно отобразить? $ .view (это) .___ (...)? – Jrop

ответ

2

@Jrop: На данный момент ваше обходное решение имеет смысл. Ваш сценарий относится к некоторым будущим функциям JsObservable для привязки массивов с преобразованием (например, фильтром, сортировкой или страницей), определяющим взаимосвязь между исходным и целевым массивами. Цель будет увеличивать события изменения массива всякий раз, когда его содержимое изменяется в результате наблюдаемых изменений в источнике.

Текущие наблюдаемые API должны сделать это возможным для реализации сегодня, но полуоткрывающий подход из коробки в JsViews пока недоступен.

Другим подходом может быть производный код {{for_with_filtering ...}}, полученный от {{for}}, но где вы можете дополнительно включить фильтр: {{forplus list filter=~filter('xyz')}}. Я скоро опубликую связанный образец, показывая {{for}}, который позволит вам установить начало и целые числа для итерации. ({{for_range ...}}).

0

Хорошо, поэтому я нашел обходное решение для этого, хотя я бы очень хотел, чтобы @BorisMoore взвесил это!

Решение состоит в том, чтобы обновить представление вручную, поскольку отфильтрованные данные не содержат === связанных данных (я думаю). Так что вместо того, чтобы делать:

$.observable(data.list).insert(data.list.length, item); 

я изменил:

data.list.push({...}); 
$.view('#target', true, 'data').refresh(); 

Где #target является селектор цели <div>, который содержит отображаемое содержимое.

Опять же, я действительно был бы рад, если бы @BorisMoore мог взвесить на этом, так как это решение обновляет кусок представления вместо поэтапного добавления элемента (из того, что я понимаю).