ExtJS的。在渲染

时间:2016-10-27 07:05:26

标签: javascript extjs

由于thread似乎非常过时,让我问一个类似的问题。所以,我有一个store定义如下:

Ext.define('GeoServer.store.ObjectsStore', {
    extend: 'Ext.data.TreeStore',
    requires: ['GeoServer.model.ObjectsModel'],
    model: 'GeoServer.model.ObjectsModel',
    autoLoad: false,
    proxy: {
        type: 'ajax',
        url: 'controller/MapsHandler.php',
        extraParams: {
            action: 'listObjects'
        }
    }
});

如您所见,autoLoad设置为false。这是因为我不想在页面加载时加载几十个商店,我只想在需要时加载它们。例如,在这种情况下,当我在里面显示一个treepanel的窗口时,我需要加载这个商店。我展示这个窗口的方式是:

Ext.create("Ext.window.Window",{ 
    title: "Objects",
    height: size.height,
    width: size.width,
    constrainHeader:true,
    layout:"fit",
    maximizable:true,
    items:[{
        xtype: 'treepanel',
        rootVisible: false,
        scrollable: true,
        itemId: 'Objects',
        store: 'ObjectsStore',
        border: false,
        autoLoad: true // has no effect
    }]
}).show();

但令人讨厌的是,当窗口第一次显示时,即使我看到服务器请求被触发,树也不会填充数据。但是,当窗口显示第二,第三等时间时,一切都很好。那么,第一次有什么特别之处以及如何以正确的方式使用这个autoLoad属性?

1 个答案:

答案 0 :(得分:3)

如果您希望在应用程序启动时加载商店,则需要在商店中自动加载true。

你有两个机会,在商店负载上显示窗口:

    var store=Ext.getStore('ObjectsStore'),
         view=this.getView();
     view.mask('loading');
     store.on('load',function(){
         view.unmask();
         YourWindow.show();
     });
     store.load();

或者您可以尝试在渲染侦听器之前加载商店:

listeners:{
   beforerender: function(){
      Ext.getStore('ObjectsStore').load();
   }
}

在我看来,最好的解决方案是第一个,Store执行异步加载,因此您总是会看到您的树形面板填充在他的负载上