Ext JS第二次加载时为空ItemSelector

Posted

技术标签:

【中文标题】Ext JS第二次加载时为空ItemSelector【英文标题】:Ext JS empty ItemSelector when loaded for the second time 【发布时间】:2012-03-12 03:45:32 【问题描述】:

我是 ExtJS 的新手,我正在使用 ExtJS 4.0.7 和他们所谓的 MVC,只是习惯了代码,所以,我正在查看示例,其中有一个可以完美运行对于我正在尝试做的事情,“MultiSelect and ItemSelector”示例,更具体地说,ItemSelector,这是我正在使用的那个,它使用某种名为“ux”的库,例如我认为,但 ItemSelector 对我来说没问题,我不想更改或向组件添加任何内容,所以,我要做的是,创建一个包含 Form 的窗口,并在表单中使用 ItemSelector,ItemSelector 使用远程存储因为我从数据库加载数据,一切正常,我可以在 ItemSelector 中看到数据并使用该组件,问题是当我关闭窗口并再次打开它时,ItemSelector 只是空的,没有错误,没有警告,没有任何问题,只是一个空的 ItemSelector,这是我的代码:

//My window definition
Ext.define('Sigep.view.ProjectForm', 
    extend: 'Ext.Window',
    uses: ['Ext.ux.form.ItemSelector'],
    id:"projectFormWindow",
    title: 'New Project',
    autoHeight:true,
    width: 700,
    modal:true,
    layout: 'fit',
    initComponent: function() 
        var win = this;
        var studentStore = Ext.create('Sigep.store.StudentsStore');
        this.items = [
        
            xtype:"form",
            id: 'projectForm',
            bodyPadding: 10,
            border:false,
            autoHeight:true,
            postUrl:baseURL+'projects/save',
            defaults: 
                border:false
            ,
            fieldDefaults: 
                labelAlign: 'left',
                labelWidth: 110,
                msgTarget: 'side'
            ,
            items:[
            
                xtype:'tabpanel',
                plain:true,
                activeTab: 0,
                height:260,
                margin: '10 0 0 0',
                defaults:
                    bodyStyle:'padding:10px'
                ,
                items:[
                    title:'Autor(es)',
                    defaults: 
                        allowBlank:false
                    ,
                    defaultType: 'textfield',
                    items:[
                    
                        xtype: 'itemselector',
                        name: 'project[authors][]',
                        id: 'itemselector-field',
                        anchor: '100%',
                        labelWidth: 90,
                        width:600,
                        height:210,
                        fieldLabel: 'ItemSelector',
                        imagePath: baseURL+'extjs/ux/images/',
                        store: studentStore,
                        displayField: 'fullName',
                        valueField: 'userId',
                        maxSelections:2,
                        buttons: ['add', 'remove'],
                        delimiter:null
                    
                    ]
                ]
            
            ]
        
        ];
        this.buttons= [
            text: 'Save',
            handler:function()
                win.close();
            
        ,
            text: 'Cancel',
            handler:function()
                win.close();
            
        ];
        studentStore.load();
        this.callParent();
    
);  
///////////////////////////////////////////////
//In a click event of a button
var win = Ext.create('Sigep.view.ProjectForm');
win.show();  

//////////////////////////////////////////////
//The Store definition
Ext.define('Sigep.store.StudentsStore', 
    extend: 'Ext.data.Store',
    fields: ['userId', 'fullName'],
    proxy: 
        type: 'ajax',                
        url:baseURL+'accounts/students',
        reader: 
            type: 'json',
            root: 'results'
        
    
);  

我也尝试将autoLoad:true设置为商店,但它也不起作用,所以,如您所见,一切都很简单,我第一次打开窗口,一切正常,但是当我关闭时然后再次打开,ItemSelector 是空的,我已经尝试了每个我可以尝试的事件,但没有任何工作,使用 FireBug,在显示窗口后,我执行类似这样的操作

//if i execute this code after the window is show, the item selector is filled with the data
var item = Ext.getCmp("projectFormWindow").down('#itemselector-field');
var store = item.store;
item.bindStore(store);  

此代码在窗口显示后重新加载 itemselector,所以我尝试在 show 事件中,但它不起作用,如果我在窗口和处理程序中放置这 3 行按钮,则 ItemSelector 加载正常.有趣的是 ItemSelector 扩展了 MultiSelect,如果我将 xtype 更改为 multiselect,它工作得很好,非常完美,但是 ItemSelector 呢,我正在查看定义代码,我认为类似于第二次加载 @987654324 @ 没有被创建,但我不知道如何处理这个,

那么,是否存在一个解决方法?让它工作的方法?希望你们能帮帮我

谢谢

【问题讨论】:

【参考方案1】:

我正在查看 Ext js 论坛,有人给出了解决方案,我不知道它是否是最好的,但它对我有用,

studentStore.load(function()
            win.down('#itemselector-field').bindStore(studentStore);
        );  

现在,它正在按我的意愿工作

希望能帮到别人

【讨论】:

【参考方案2】:

在我的 Forms initComponent 方法中,我为 beforerender 添加了一个监听器

initComponent: function () 
    var me = this;
    Ext.applyIf(me, 
        listeners: 
        beforerender: 
                fn: me.onFormBeforeRender,
                scope: me
            
       
    );

    me.callParent(arguments);

,

onFormBeforeRender: function(abstractcomponent, options) 
            // where store is created globally like this var store = Ext.create('TIP.store.CommodityStore');

    store.load(function()
        Ext.getCmp("commoselector").bindStore(store);
    );

【讨论】:

以上是关于Ext JS第二次加载时为空ItemSelector的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 访问令牌在第二次尝试使用 ParseFacebookUtils 登录 Facebook 时为空

self.navigationController 第二次加载 ViewController 时为零

首次提交表单时为空值

核心图像过滤器的输出图像第二次在 UIImage 上运行时为零

从另一个活动调用时为空侦听器

Next.js:使用图像组件时为空的 alt 标记