Неопределенный метод Extjs при расширении через define

#javascript #extjs

#javascript #extjs

Вопрос:

Может кто-нибудь сказать мне, почему я продолжаю получать метод buildItems, не определенный в следующем коде? Я избегаю чего-то существенного?

 Ext.define('MyApp.view.Viewport', { 
extend: 'Ext.container.Viewport',
requires: [
    'Ext.layout.container.Border'
],

layout  : 'border',
items   : [this.buildItems()],

buildItems      : function() {
    return { region:'center',xtype:'panel'}
}
});
  

Метод buildItems не имеет оснований быть общедоступным методом, я только сначала попробовал этот способ. Именно так я делаю это сейчас:

 (function() {
function buildItems () {
    return [
            {
                region  : 'center',
                xtype   : 'panel',
            }, {
                region  : 'west',
                xtype   : 'panel',
                width   : 225
            },{
                region  : 'south',
                xtype   : 'panel',
                height  : 50
            },{
                region  : 'north',
                xtype   : 'panel',
                height  : 50
            }
    ]   
}

return Ext.define('MyApp.view.Viewport', { 
    extend: 'Ext.container.Viewport',
    requires: [
        'Ext.layout.container.Border'
    ],

    layout  : 'border',
    items   : buildItems()
});
})();
  

Является ли это чрезмерным?

спасибо

Ответ №1:

Проблема в том, что во время выполнения строки

 items   : [this.buildItems()],
  

область видимости является глобальным объектом, т.е. this оценивается как window .
Вы в любом случае не должны помещать items в класс, поскольку экземпляры могут изменять item элементы, поэтому правильный способ сделать это

 initComponent: function () {
    this.items = this.buildItems(); // now, "this" is the current component instance
    // superclass.initComponent...
}
  

Редактировать: В качестве ответа на вторую часть вопроса

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

Комментарии:

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

Ответ №2:

Это потому, что функция определена в другой функции, и доступ к области просмотра будет осуществляться за пределами этой самоисполняющейся функции. Итак, поместите этот buildItems() вне самоисполняющейся функции и попробуйте то же самое.

Комментарии:

1. Я удалил вторую часть вопроса, чтобы устранить путаницу. Однако ваш ответ не помогает.