Пересчитать поле модели

У меня есть требование пересчитать поле в модели по определенному событию. Я хочу вычислить значение непосредственно в модели, а не в визуализаторах представлений, потому что в противном случае для нескольких представлений также потребовались бы специальные функции сортировки и группировки, поэтому код сильно раздулся бы. Однако я мог бы использовать convert вместо calculate, если это поможет.

Поля на модели:

fields: [{
    name: 'name',
    type: 'string'
},{
    name: 'localizedName',
    calculate: function(data) {
        return Globals.localize(data.name);
    }
}]

и функция в магазине:

onUILocaleChange: function() {
    this.each(function(record) {
        // force recalculate
    });
}

Я сделал скрипт, который демонстрирует поведение, которого я хочу добиться, но без плохого хакерского обходного пути: https://fiddle.sencha.com/#view/editor&fiddle/2g7g
Я бы хотел, чтобы это работало без строк 73-75, на месте в модели.


person Alexander    schedule 02.05.2018    source источник


Ответы (1)


Просто измените функцию вычисления, чтобы отправить Globals.language в качестве параметра:

{
     name: 'localizedName',
     persist: false,
     calculate: function(data) {
          return Globals.localize(data.name,Globals.language);
     }
}

А затем измените свою функцию локализации, чтобы получить этот параметр:

localize: function(v,l) {
            return Globals[l][v];
}

И наконец, просто перезагрузите магазин после изменения Globals.language на обработчике события кнопки:

handler: function(btn) {
   Globals.language = 'de';
   btn.up('grid').getStore().load();
}

Полностью удалите «onUILocaleChange».

person Fabio Barros    schedule 02.05.2018
comment
Спасибо за ваш вклад. Если я правильно понимаю, часть параметра изменения является совершенно ненужным изменением, только store.load уже делает свое дело. Однако есть ли способ просто пересчитать без перезагрузки хранилища, что означает потерю состояния и т. Д. В записях? - person Alexander; 03.05.2018
comment
Ну, это не красиво, но вы можете сделать это: btn.up('grid').getStore().each(function(rec) { rec.set('localizedName', rec.get('localizedName'))}) ; - person Fabio Barros; 03.05.2018