Extjs 4 создает ajax-запрос ширины элементов панели инструментов - PullRequest
2 голосов
/ 13 октября 2011

Мне нужно создать панель инструментов, которая вычисляет свои элементы по запросу 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');
        }

   }
   });

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Назначение компонентов нотации объекта для this.items работает только до вызова callParent в initComponent.

После этого элементы уже инициализированы, ext не будет принимать изменения в нем.Вместо этого вы должны использовать метод add компонента * Toolbar .

В вашем методе buildItems вместо создания массива просто вызовите add с компонентом нотации объекта:

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

Я не проверял это, но я почти уверен, что именно так я и сделал (из головы)

Редактировать: добавил меня переменную для области действия

2 голосов
/ 13 октября 2011

Почему бы не воспользоваться загрузчиком компонентов? Смотри: http://dev.sencha.com/deploy/ext-4.0.2a/examples/component-loader/component-loader.html

0 голосов
/ 13 октября 2011

Ваш первый console.log вызов находится за пределами вашего обратного вызова, и поэтому он вызывается до того, как запрос Ajax завершится.

При втором вызове console.log он вызывается внутри обратного вызова ...который инициируется после завершения запроса Ajax.По сути, вам нужно выполнить всю работу в обратном вызове, если вы собираетесь использовать данные, возвращенные из запроса Ajax.

...