как вызвать фильтр массива в шаблоне ractivejs

Поэтому я не хочу использовать функции данных (скажем, я хочу, чтобы конечный пользователь взаимодействовал только с шаблонами, а не с жестким кодом javascript). Если бы у меня был этот массив с элементами n, как я могу его отфильтровать? я могу получить элементы m в шаблоне ractive? прямо сейчас у меня есть этот код >> http://jsfiddle.net/t168vymw/4/, который работает неправильно.

требования: я не могу использовать какую-либо функцию для фильтрации, например data: {filtersomething: function(){...} } , но вместо этого позволяю пользователю играть со сложными преобразованиями функций массива из шаблона. Ractive еще поддерживает это?


person alexserver    schedule 23.09.2014    source источник


Ответы (2)


Ractive не поддерживает ничего, что включает ключевое слово function внутри выражений, но есть 3 способа сделать это:

  • функции данных,
  • вызовы методов (вызов методов экземпляра ractive из шаблона),
  • фильтрация данных прямо в шаблоне.

Вы сказали, что хотите, чтобы вся логика была в шаблоне, поэтому у нас остается вариант № 3. Например, если вы хотите отобразить только четные числа из списка, вы можете сделать это:

{{ #a }}
    {{ #!(this % 2) }}
        {{ this }}
    {{/}}
{{ /a }}

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

person Martin Kolárik    schedule 23.09.2014
comment
Я знаю, что это антипаттерн, и некрасиво иметь javascript в шаблоне, но это требование держать пользователя подальше от кода js. Спасибо за помощь. - person alexserver; 23.09.2014

Если вы хотите открыть его для произвольного js от пользователя, вы можете сделать что-то вроде этого (http://jsfiddle.net/h7ut7cbx/2/):

<input value='{{filter}}'>
<br>
{{# filtered }}
    {{.}}<br>
{{/ }}

и

data: {
    a: [1,2,3,4,5,6],
    filter: 'b%2'
},
computed: {
    filtered: function(a, filter){
        var fn = new Function('b', 'return ' + (this.get('filter')||'true') + ';')
        return this.get('a').filter(fn)
    }
}
person martypdx    schedule 23.09.2014
comment
Это идеальное решение, но пользователь не может редактировать экземпляр Ractive js. Спасибо за помощь - person alexserver; 23.09.2014
comment
Им это не нужно. filter: 'b%2' просто по умолчанию. Или я что-то упускаю? - person martypdx; 23.09.2014