Компонент расширения ExtJS, неспособный сделать this.findById()

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

Вот что можно...

var myMenu = new Ext.menu.Menu({
    id: "my-menu",
    items: [{
        id: "first-item",
        text: "hello"
    }]
});

Когда я делаю это...

myMenu.findById('first-item');  // it will return a component...

ОДНАКО, когда я пытаюсь расширить его таким образом...

NewMenu = Ext.extend(Ext.menu.Menu, {

    id: "",
    win_id: "",

    initComponent: function(){
         // All the neccessary code
    },

    onRender: function(){
         // codes...
    },

    // Override the add function
    add: function(){
         this.findById(this.win_id); // return NULL
    }
});

Извините за мои недостающие коды. Я понимаю, что это может быть связано с тем, что объект не отобразился после добавления элемента, поэтому он вернет NULL. Есть ли способ сделать это? Я использую ExtJS 3.0, поэтому нет метода onAdd для переопределения. Не уверен, что это поможет.

Дайте мне знать, если я пропущу какую-либо важную информацию.

Ура и большое спасибо, Микки


person Mickey Cheong    schedule 12.01.2010    source источник


Ответы (2)


у вас есть это в NewMenu.initComponent?

NewMenu.superclass.initComponent.call(this);
person jujule    schedule 14.01.2010
comment
Да... Я использовал другой метод, чтобы справиться с этим. Спасибо. - person Mickey Cheong; 24.01.2010

Второй параметр Ext.extend() должен быть объектом, а не функция:

NewMenu = Ext.extend(Ext.menu.Menu, {

    id: "",
    win_id: "",

    initComponent: function(){
         // All the neccessary code
    },

    ...

РЕДАКТИРОВАТЬ: если синтаксис не проблема, я думаю, вы правы насчет that the object has not render after it added the item. Я думаю, что это важное ограничение: компонент не инициализируется полностью до тех пор, пока базовый элемент DOM не будет вставлен и отображен в документе.

Может быть, я могу предложить что-то, если вы объясните, что вы хотите сделать с возвращаемым значением this.findById(this.win_id), например, отложить инициализацию пунктов меню до тех пор, пока хотя бы элемент win_id не будет отрисован.

person Lukman    schedule 12.01.2010
comment
ой, мой плохой ... код работает отлично, как и без ошибок в Firebug, за исключением того, что когда я выполняю действие добавления, он возвращает null во время выполнения this.findById(). Любой намек? - person Mickey Cheong; 12.01.2010
comment
на самом деле, я использую возврат this.findById(this.win_id) внутри .on('show', function(){ /* ... здесь ... */}). Он будет использоваться позже, когда событие show будет запущено окном. Короче говоря, я буду присоединен к слушателю после того, как добавлю элемент, так что при срабатывании окна он будет ссылаться на добавленный элемент и манипулировать им. - person Mickey Cheong; 13.01.2010