ExtJs4+: можно ли редактировать вычисляемое поле модели?

Моя модель имеет два поля данных: постоянное и вычисляемое:

Ext.define('My.model.Value', {
    extend: 'Ext.data.Model',
    idProperty: 'id',
    fields: [
        { name: 'id', type: 'auto' },
        { name: 'percentage', type: 'float' }, // values in 0..1 range
        { name: 'percentageDecimal', type: 'float', persist: false,
            calculate: function(v) {
                v = v.percentage;
                return Ext.isNumber(v) ? v * 100.0 : v;
            }
        }
    ]
});

Поле percentageDecimal используется в сетке и доступно для редактирования.

Вопрос: как я могу изменить свою модель, чтобы автоматически обновлять поле percentage каждый раз, когда обновляется percentageDecimal?

Я использую ExtJs 5.0.1.


person Andrey    schedule 16.10.2014    source источник


Ответы (3)


Я использовал предложение @adaskos следующим образом:

Ext.define('My.model.Value', {
    extend: 'Ext.data.Model',
    idProperty: 'id',
    fields: [
        { name: 'id', type: 'auto' },
        { name: 'percentage', type: 'float' }, // values in 0..1 range
        { name: 'percentageDecimal', type: 'float', persist: false,
            calculate: function(v) {
                v = v.percentage;
                return Ext.isNumber(v) ? v * 100.0 : v;
            }
        }
    ],
    set: function (fieldName, value, options) {
        if (Ext.isString(fieldName)) {
            // single field update
            if (fieldName === 'percentageDecimal') {
                this.set('percentage', Ext.isNumber(value) ? 0.01 * value : value);
                return;
            }
        } else {
            // multiple fields update
            if (Ext.isDefined(fieldName.percentageDecimal)) {
                var data = Ext.clone(fieldName);
                data.percentage = Ext.isNumber(data.percentageDecimal) 
                  ? 0.01 * data.percentageDecimal 
                  : data.percentageDecimal;
                delete data.percentageDecimal;
                this.set(data);
                return;
            }
        }
        this.callParent(arguments);
    }
});
person Andrey    schedule 22.10.2014

Я не знаю, добавили ли они автоматический способ сделать это в 5.0.1, но вы всегда можете переопределить метод set, и всякий раз, когда происходит обновление percentageDecimal, вы пересчитываете percentage.

Альтернатива, которую я предпочитаю: если вы ожидаете достаточно обновлений, но все, что вы хотите, это отобразить его в сетке, вы можете удалить дополнительное вычисляемое поле из модели и установить свой столбец с помощью dataIndex: 'percentageDecimal' и изменить его функцию renderer, чтобы отображать его так, как вам нравится ( как десятичная).

Как показано ниже:

... , { text: 'Percentage', dataIndex: 'percentageDecimal'
    , renderer: function (v) {
        return Ext.isNumber(v) ? v * 100.0 : v;
    }
  }
person adaskos    schedule 16.10.2014
comment
Ваше решение хорошее, но мне нужно отредактировать столбец «Процент» в сетке, и значение для редактирования должно быть в диапазоне 0..100. - person Andrey; 17.10.2014

Вы должны использовать параметры конфигурации depends для автоматического обновления! И используйте функцию convert вместо calculate (не уверен, что она работает с вычислением, мне нужно проверить)

См. http://docs.sencha.com/extjs/5.1/5.1.0-apidocs/#!/api/Ext.data.field.Field-cfg-depends

person Psycho    schedule 18.03.2015
comment
Я не понимаю, как конфигурация зависимостей может обеспечить двустороннее обновление. Эта конфигурация просто сообщает ExtJs, что поле «имя» должно обновляться каждый раз, когда обновляются «firstName», «lastName». - person Andrey; 18.03.2015