Почему Ext.form.Field. setValue () не запускает событие? Как это «исправить»?

Почему setValue Ext.form.Field не запускает событие для уведомления слушателей, что его значение изменилось? Я знаю, что есть событие change и select для поля со списком, но они запускают события только при взаимодействии с пользователем. А что насчет того, когда другой компонент изменяет значение поля? Позвольте мне объяснить ситуацию, с которой я столкнулся с банкоматом.

В настоящее время я работаю над повторно используемым компонентом набора полей (назовем его ux.fieldset) с комбинированным списком и другим набором полей внутри. Я зарегистрировал слушателя в поле со списком, который прослушивает событие select , и при его запуске просто оценивает выбранное значение и показывает / скрывает внутренний набор полей.

Затем я добавляю этот ux.fieldset как компонент одной из моих форм.

Теперь, когда я выполняю loadRecord () в форме, я хочу, чтобы значение внутреннего поля со списком было переоценено, чтобы я мог показать / скрыть внутренний набор полей моего компонента. Код, который выполняет эту оценку, очевидно, должен быть в ux.fieldset, поскольку он содержит поле со списком и, поскольку он может использоваться повторно, было бы разумно поместить его туда (DRY).

Есть ли лучший или лучший способ справиться с этим сценарием? Я вставил код своего ux ниже на тот случай, если кого-то смущает мое объяснение выше.

Ext.ux.form.StatusFieldSet = Ext.extend(Ext.form.FieldSet, {
     enablePublishFrom      : false // Wether or not the option to (un)publish on a certain date should be visible, defaults to false
    ,item_store             : false
    ,combo                  : false
    ,date_publish           : false
    ,date_unpublish         : false
    ,helpBox                : {
         xtype              : 'box'
        ,autoEl             : {cn: 'Help text<br />'}
    }
    ,publishData_fieldset   : false
    ,datePickerWidth        : 60 // The width of the datepickers in the subfieldset

    ,initComponent : function(){

        this.item_store = [['online',  _('Gepubliceerd')]]; // Online
        if(this.enablePublishFrom) {this.item_store.push(['pending', _('Publiceer op datum')]);} // Publish on date
        this.item_store.push(['offline', _('Niet gepubliceerd')]); // Offline

        this.combo = new Ext.form.ComboBox({
             name           : 'status'
            ,hideLabel      : true
            ,displayField   : 'txt'
            ,valueField     : 'quicklink'
            ,hiddenName     : 'status'
            ,value          : 'online'
            ,forceSelection : true
            ,allowBlank     : false
            ,editable       : false
            ,triggerAction  : 'all'
            ,mode           : 'local'
            ,store          : new Ext.data.SimpleStore({
                 fields     : [ 'quicklink', 'txt' ]
                ,data       : this.item_store
            })
            ,listeners      : {
                 scope      : this
                ,select     : function(combo, value, index) {   // HERE I would like to add another listener that gets triggered when another value is selected or set through setValue()
                    this.showOnPending(value.data.quicklink);
                }
            }
        });

        this.date_publish = new Ext.form.DateField({
             fieldLabel : _('Publiceer op')
            ,name       : 'publish_date'
            ,format     : 'd-m-Y'
            ,width      : this.datePickerWidth
        });

        this.date_unpublish = new Ext.form.DateField({
             fieldLabel : _('De-publiceer op')
            ,name       : 'unpublish_date'
            ,format     : 'd-m-Y'
            ,width      : this.datePickerWidth
        });

        this.publishData_fieldset = new Ext.form.FieldSet({
             autoHeight         : true
            ,hidden             : true
            ,anchor             : '0'
            ,defaults           : {
                 labelSeparator : ''
                ,anchor         : '0'
            }
            ,items              : [ this.helpBox, this.date_publish, this.date_unpublish ]
        });

        // Config with private config options, not overridable
        var config = {
             items      : [ this.combo, this.publishData_fieldset ]
            ,title      : _('Status')
            ,autoHeight : true
        };

        Ext.apply(this, Ext.apply(this.initialConfig, config));

        Ext.ux.form.StatusFieldSet.superclass.initComponent.call(this, arguments);

    }

    ,showOnPending: function(v) {
        if(v == 'pending'){
            this.publishData_fieldset.show();
        } else {
            this.publishData_fieldset.hide();
        }
    }
});

Ext.reg('statusfieldset', Ext.ux.form.StatusFieldSet);

ОБНОВЛЕНИЕ:

Мне удалось решить эту проблему, перегрузив метод setValue в экземпляре combobox. Но это ни в коем случае не изящное и не хорошее решение, если вы спросите меня.

this.combo.setValue = function(v){
    this.showOnPending(v);
    return Ext.form.ComboBox.superclass.setValue.apply(this.combo, arguments);
}.createDelegate(this);

Я хотел бы получить информацию от ветеранов ExtJS, как они с этим справятся.

8
задан ChrisR 24 January 2011 в 12:40
поделиться