2

我必须创建一个从 ajax 请求计算其项目的工具栏。查看 initComponent 和 buildItems 这两个函数,我没有得到相同的 toolbar.items 元素结果,即使 ajax 请求的运行正确完成,正如您在调用 console.log 后在 builsItems 方法中看到的那样。请帮助(我是初学者,我正在使用 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');
        }

   }
   });
4

3 回答 3

3

将对象符号组件分配给this.items仅在 initComponent 中的 callParent 之前有效。

之后,项目已经初始化,ext 不会接受对其的更改。您应该改用 Toolbar 组件的add 方法

在您的 buildItems 方法中,无需构建数组,只需使用您的对象符号组件调用 add :

var me = this;
Ext.each(applist, function(rec){
                   me.add({'text'     :rec.appid,
                                   'iconCls'  :rec.iconcls,
                                   'operation':rec.appcode
                                  }
                                );                     
                 });

我还没有测试过,但我很确定我就是这样做的(从我的头顶)

编辑:为范围添加了 me 变量

于 2011-10-12T22:25:37.250 回答
2

为什么不利用组件加载器呢?请参阅:http ://dev.sencha.com/deploy/ext-4.0.2a/examples/component-loader/component-loader.html

于 2011-10-13T00:53:36.980 回答
0

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

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

于 2011-10-12T22:01:39.387 回答