Използване на помощници в ключов път с ractivejs

Имам функция, която се извиква при щракване върху елемент и сравнявам два масива. Първият масив се отпечатва в DOM с израз, който филтрира масива.

Дръжки:

{{#each search(~/budgets, searchValue, 'accountName'):i}}
    <p on-click="compareValues">{{accountName}}</p>
{{/each}}

JS:

Ractive.on('compareValues', function(target) {
    if(Ractive.get(target.keypath + '.accountName') === Ractive.get(target.keypath.replace('budgets', 'accounts') + '.accountName') {
        console.log(true);
    } else {
        console.log(false);
    }
});

Примерен target.keypath, който получавам, е "${search(budgets,searchValue,"accountName")}.4".

Бих искал да мога да сравня този получен масив с друг масив, който също ще премине през израза, така че се опитах да използвам замяна, така че да превключи масивите, които се използват в израза.

Възможно ли е да използвам израза само върху масив, който вече е преминал през израза и вече има резултат, тъй като ставам недефиниран, когато променям масива?


person silverlight513    schedule 12.05.2015    source източник
comment
Това е странна стойност за target.keypath. Това ли очакваше? Той трябва да представлява структурата на вашия data обект. Пример: ако data : { budgets: [ {accountName: "one"} ] } тогава ключът към accountName е budgets.0.accountName   -  person Keith    schedule 12.05.2015
comment
@Keith Очаквах това, тъй като цикълът съдържа израз, в противен случай щеше да търси данните на грешното място.   -  person silverlight513    schedule 14.05.2015


Отговори (1)


Може просто да използвате контекста на събитието, за да вземете текущия елемент в масива:

ractive.on('compareValues', function() {
    var current = this.event.context,
        index = this.event.index.i;
});

В противен случай можете да дефинирате изчислено свойство за търсенето:

var r = new Ractive({
    el: document.body,
    template: '#template',
    computed: {
        search: function(){
            var budgets = this.get('budgets'),
                searchValue = this.get('searchValue'),
                searchField = this.get('searchField')

            return budgets.filter(function(each){
                return each[searchField] = searchValue;
            });
        }
    }
});

След това можете да използвате в шаблона:

{{#each search:i}}
    <p on-click="compareValues">{{accountName}}</p>
{{/each}}

И чрез api:

ractive.get('search.' + index + '.accountName')
person martypdx    schedule 13.05.2015