2014-11-28 3 views
1

Когда в Ext.form.Panel содержится еще одна Ext.form.Panel, проверка внутренней панели выравнивается до внешней панели.ExtJS (4.2.2) поведение проверки вложенной формы

У меня есть вложенная модель с отношениями hasMany. Панель внутренней формы используется для добавления записей дочерней модели в родительскую запись. Панель внутренней формы имеет свою собственную логику проверки и кнопку сохранения, которая добавляет содержимое родительскому элементу.

Но внешняя панель формы теперь недействительна внутренней панелью формы, которая не является тем, что я хочу. Панель внутренней формы может (и должна) быть очень чистой (и недействительной), когда я хочу сохранить всю запись (включая отношения hasMany).

Как предотвратить проверку внутренней панели формы на внешнюю панель формы?

Это похоже на логическую задачу, рассматривающую поддержку ExtJs для вложенных моделей, но, похоже, нигде не поддерживается. Я не хочу вытаскивать какое-то окно либо при добавлении детей. Он должен быть хорошо интегрирован с исходной формой

Спасибо за любую помощь.

РЕШЕНИЕ

Использование field.up('form') может повлиять на производительность немного, так что берегитесь.

Ext.define('Custom.form.Basic', { 
    extend: 'Ext.form.Basic', 

    onFieldAdd: function (field) { 
     if (field.up('form') == this.owner) 
      this.callParent(arguments); 
    }, 

    onFieldRemove: function (field) { 
     if (field.up('form') == this.owner) 
      this.callParent(arguments); 
    }, 

    getFields: function() { 
     var owner = this.owner; 
     return this.monitor.getItems().filterBy(function (f) { 
      return f.up('form') == owner; 
     }); 
    } 
}); 

Ext.define('Custom.form.Panel', { 
    extend: 'Ext.form.Panel', 

    requires: [ 
     'Custom.form.Basic' 
    ], 

    createForm: function() { 
     var cfg = {}, 
      props = this.basicFormConfigs, 
      len = props.length, 
      i = 0, 
      prop; 

     for (; i < len; ++i) { 
      prop = props[i]; 
      cfg[prop] = this[prop]; 
     } 
     return new Custom.form.Basic(this, cfg); 
    } 
}); 

ответ

2

Эта проблема связана не с Ext.form.Panel, но с Ext.form.Basic. Каждый FormPanel содержит Ext.form.Basic, и эта основная форма отвечает за проверку. Чтобы избежать этого, вы можете расширить базовую форму и изменить методы поведения onFieldAdd и onFieldRemove. По дизайну он добавляет обработчики ко всем дочерним полям панели на любом уровне. Затем вы должны расширить метод Ext.form.PanelcreateForm, чтобы он возвращал вашу расширенную базовую форму.

+0

Спасибо, это было главным образом решением. Мне также пришлось переопределить getFields в Ext.form.Basic, чтобы не включать элементы дочерней формы. –

Смежные вопросы