2010-07-29 6 views
1
// Using extjs 3.x 
var box = new Ext.Textfield { /* textField configuration */ }; 
var form = new Ext.FormPanel{ 
    /* formPanel configuration */ 
    items:[box] 
} 

Это прекрасно работает, но я хочу создать несколько экземпляров box так, что когда я создаю несколько экземпляров из form я не коррумпированный box, и я не хочу использовать массивы , Пожалуйста, предложите лучший подход к созданию и управлению несколькими экземплярами Ext.ComponentExtJS 3.x несколько экземпляров

ответ

4

Расширение компонентов является ключевым

var MyBoxClass = Ext.extend(Ext.form.TextField,{ 
    /* your config values */ 
    width: ... 

    /* this is important, see bmoeskau's comment below*/ 
    initComponent: function() { 
    BoxClass.superclass.initComponent.call(this); 
    } 
}); 


var form = new Ext.FormPanel{ 

    items: [ 
    new MyBoxClass({fieldLabel: 'first box'}), 
    new MyBoxClass({fieldLabel: 'second box'}), 
    new MyBoxClass({fieldLabel: 'third box'}), 
    ] 

} 

+1

Пример в порядке, но initComponent на самом деле не требуется. Требуется, чтобы, если вы * сделаете * переопределить initComponent, вы * должны * вызывать версию суперкласса (хотя это относится к любому унаследованному методу в жизненном цикле компонента, который вы переопределяете). В этом примере его можно опустить - он будет вызван для вас уже. –

+0

Спасибо за разъяснение! – Mchl

5

@ MCHL-х answer хороший подход для создания многократно используемых компонентов, особенно если вам необходимо изменить или добавить новое поведение к существующему. Если вам просто нужно повторно использовать некоторые настройки конфигурации и больше ничего, вы можете сделать что-то немного проще:

cfg = { 
    xtype: 'textfield', 
    width: 100, 
    maxLength: 10 
} 

new Ext.FormPanel({ 
    items: [cfg, cfg] 
}); 

Если вам нужно добавить специфичные для экземпляра поля конфигурации (например, идентификатор, например), вы можете просто передать в ваши уникальные значения и добавить CFG по умолчанию к ним (applyIf не заменит существующие свойства, он будет только добавить свойства):

new Ext.FormPanel({ 
    items: [ 
     Ext.applyIf({id:'foo'}, cfg), 
     Ext.applyIf({id:'bar'}, cfg) 
    ] 
}); 

Одна вещь, которую я хотел бы добавить к @ ответ MCHL является то, что если вы собираетесь сделать старайтесь создать свой собственный класс, убедитесь, что вы даете ему свой собственный xtype. Таким образом, вы все еще можете использовать ленивые возможности экземпляра Ext, даже с вашими собственными компонентами, вместо того, чтобы создавать экземпляры всего во время init.

+0

Я думаю, что это действительно классический пример –

+0

есть проблема в том, что его не изменяющийся идентификатор, когда мы применяем более чем один номер : [ Ext.apply (cfg, {id: 'foo'}), Ext.apply (cfg, {id: 'bar'}) ] ] чем его не принимает «бар» его повторяющийся «foo» –

+0

Извините, мой измененный код, который использует applyIf вместо apply - таким образом используется переданный объект и cfg применяется только для любых дополнительных значений по умолчанию, которые не указаны. Та же концепция, что и первоначально объяснялась. –

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