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

У меня есть требование пересчитать поле в модели для определенного события. Я хочу вычислить значение непосредственно в модели, а не в средствах визуализации представлений, потому что в противном случае для нескольких представлений также потребуются настраиваемые функции сортировки и группировки, поэтому код будет сильно раздуваться. Я мог бы однако использовать 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/
Я хотел бы, чтобы это работало без линии 73-75, на месте в модели.

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" полностью.

Другие вопросы по тегам