Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Extjs 4创建工具栏项宽度ajax请求_Javascript_Extjs_Extjs4_Extjs Mvc - Fatal编程技术网

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

Javascript Extjs 4创建工具栏项宽度ajax请求,javascript,extjs,extjs4,extjs-mvc,Javascript,Extjs,Extjs4,Extjs Mvc,我必须创建一个工具栏,用于根据ajax请求计算其项。看看initComponent和buildItems这两个函数,我并没有得到toolbar.items元素相同的结果,甚至在调用console.log后的buildItems方法中,ajax请求的运行也没有得到正确的执行。 请帮助(我是初学者,我正在使用ExtJS4)非常感谢 Ext.define('Dev.view.layout.Toolbarapp',{ extend:'Ext.toolbar.Toolbar', alias :

我必须创建一个工具栏,用于根据ajax请求计算其项。看看initComponent和buildItems这两个函数,我并没有得到toolbar.items元素相同的结果,甚至在调用console.log后的buildItems方法中,ajax请求的运行也没有得到正确的执行。 请帮助(我是初学者,我正在使用ExtJS4)非常感谢

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');
        }

   }
   });

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


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

将对象表示法组件分配给该组件。items仅在initComponent中的callParent之前起作用

在此之后,项目已经初始化,ext将不会获取对其的更改。您应该使用工具栏组件的

在buildItems方法中,只需使用对象表示法组件调用add,而不是构建数组:

var me = this;
Ext.each(applist, function(rec){
                   me.add({'text'     :rec.appid,
                                   'iconCls'  :rec.iconcls,
                                   'operation':rec.appcode
                                  }
                                );                     
                 });
我还没有测试过它,但我很确定我就是这样做的(从头开始)


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

为什么不利用组件加载器?请参阅:

这并没有真正回答问题,我这样做了,但我得到了一个错误:this.add不是一个函数。这是合乎逻辑的,因为这在每个范围内意味着范围发生了变化,所以我在Ext.each之前声明了一个变量,如下所示:var listitems=this,我将this.add替换为listitems.add。一切正常。非常感谢你,伙计。@ora-271071。是的,说得好。这是一个范围问题。这意味着每个回调中都有其他内容。extjs的方法通常是创建一个me变量并将其赋值,然后me在任何嵌套函数中都可用。我已经修改了代码。@ora-271071。您也应该接受其中一个答案(其中一个答案左侧的勾号),非常感谢您的参与。事实上,使用隐式ajax请求组件是一个很好的主意(将来我计划使用这个特性)。但现在,答案1对应我的需要,这正是我想要的。非常感谢你的回答。