Extjs 4创建工具栏项宽度ajax请求

时间:2011-10-12 20:47:20

标签: javascript extjs extjs4 extjs-mvc

我必须创建一个工具栏,根据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');
        }

   }
   });

3 个答案:

答案 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)

答案 2 :(得分:0)

您的第一个console.log调用是在回调之外,因此在Ajax请求完成之前调用它。

通过第二次console.log调用,它将在回调中被调用...这是在Ajax请求完成后启动的。基本上,如果您希望使用从Ajax请求返回的数据,则需要在回调中完成所有工作。