#javascript #extjs #extjs4 #extjs-mvc
#javascript #extjs #extjs4 #extjs-mvc
Вопрос:
Мне нужно создать панель инструментов, которая вычисляет свои элементы из запроса ajax. посмотрите на обе функции initComponent и buildItems, я не получаю одинакового результата элементов toolbar.items, даже выполнение ajax-запроса выполнено правильно, как вы видите в методе builsItems после вызова console.log. пожалуйста, помогите (я новичок, я использую Extjs 4) Большое спасибо.
Ext.define('Dev.view.layout.Toolbarapp',{
extend:'Ext.toolbar.Toolbar',
alias :'widget.toolbarapp',
border:false,
height:35,
initComponent:function(){
this.items=[];
Ext.Ajax.disableCaching=false;
Ext.Ajax.request({
url : '/gdev/jsontest',
callback:this.buildItems,
scope:this
});
console.log(this.items); //THE RESULT IS []
this.callParent(arguments);
},
buildItems:function(options, sucess, response){
if (sucess==true) {
var listItems=[];
var applist=Ext.JSON.decode(response.responseText);
Ext.each(applist, function(rec){
listItems.push({'text' :rec.appid,
'iconCls' :rec.iconcls,
'operation':rec.appcode
}
);
});
this.items=listItems;
console.log(this.items); //THE RESULT IS [Object { text=100,
iconCls="appsysadmin", operation="appsysadmin"}, Object { text=101,
iconCls="appmailxe", operation="appmailxe"}]
}
else {
Ext.MessageBox.alert('Error','not found');
}
}
});
Ответ №1:
Назначение компонентов объектной нотации this.items работает только перед callParent в initComponent.
После этого элементы уже инициализированы, ext не будет получать изменения в нем. Вместо этого вы должны использовать метод добавления компонента панели инструментов.
В вашем методе buildItems вместо построения массива просто вызовите add с вашим компонентом object notation:
var me = this;
Ext.each(applist, function(rec){
me.add({'text' :rec.appid,
'iconCls' :rec.iconcls,
'operation':rec.appcode
}
);
});
Я не тестировал это, но я почти уверен, что именно так я это и сделал (из головы)
Редактировать: добавлена переменная me для области видимости
Комментарии:
1. Я сделал это, но получаю сообщение об ошибке: this.add не является функцией. Это логично, потому что это внутри каждого означает изменение области видимости, поэтому я объявил перед Ext.each переменную, подобную следующей: var listitems=this , и я заменил this.add на listitems.add. все работает нормально. ТАК ЧТО БОЛЬШОЕ СПАСИБО, ПАРЕНЬ.
2. @ora-271071. Да, справедливое замечание. Это проблема области. это означает что-то еще в каждом обратном вызове. Способ extjs обычно заключается в создании переменной me и присвоении ей этой переменной, после чего me доступен в любой вложенной функции. Я внес изменения в код.
3. @ora-271071. Вы также должны принять один из ответов (галочка слева от одного из ответов)
Ответ №2:
Почему бы не воспользоваться загрузчиком компонентов? Смотрите: http://dev.sencha.com/deploy/ext-4.0.2a/examples/component-loader/component-loader.html
Комментарии:
1. Большое спасибо за ваше участие. на самом деле, это отличная идея для неявного ajax-запроса пользователя для компонента (в будущем я планирую использовать эту функцию). но на данный момент ответ № 1 соответствует моим потребностям, это именно то, что я хочу. ОЧЕНЬ БЛАГОДАРЕН ПАРНЮ ЗА ВАШ ОТВЕТ.
Ответ №3:
Ваш первый console.log
вызов находится за пределами вашего обратного вызова, и поэтому он вызывается до завершения Ajax-запроса.
При вашем втором console.log
вызове он вызывается внутри обратного вызова … который инициируется после завершения Ajax-запроса. В принципе, вам нужно выполнить всю свою работу в обратном вызове, если вы ожидаете использовать данные, возвращенные из Ajax-запроса.
Комментарии:
1. На самом деле это не отвечает на вопрос