#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. Я удалил вторую часть вопроса, чтобы устранить путаницу. Однако ваш ответ не помогает.