我必须创建一个工具栏,根据ajax请求计算其项目。看看initComponent和buildItems这两个函数,我没有得到相同的toolbar.items元素结果,甚至正如你在调用console.log后在builsItems方法中看到的那样正确完成了ajax请求的运行。 请帮助(我是初学者,我正在使用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');
}
}
});
答案 0 :(得分:3)
将对象表示法组件分配给 this.items 仅在initComponent中的callParent之前有效。
之后,这些项目已经初始化,ext将不会对其进行更改。您应该使用工具栏组件的add method代替。
在buildItems方法中,只需使用对象表示法组件调用add,而不是构建数组:
var me = this;
Ext.each(applist, function(rec){
me.add({'text' :rec.appid,
'iconCls' :rec.iconcls,
'operation':rec.appcode
}
);
});
我没有测试过,但我很确定我是怎么做到的(从我的脑海中开始)
编辑:为范围添加了变量
答案 1 :(得分:2)
为什么不利用组件加载器?请参阅:http://dev.sencha.com/deploy/ext-4.0.2a/examples/component-loader/component-loader.html
答案 2 :(得分:0)
您的第一个console.log
调用是在回调之外,因此在Ajax请求完成之前调用它。
通过第二次console.log
调用,它将在回调中被调用...这是在Ajax请求完成后启动的。基本上,如果您希望使用从Ajax请求返回的数据,则需要在回调中完成所有工作。