【问题标题】:extjs - Store with autoload true should not load on application launchextjs - 自动加载为 true 的存储不应在应用程序启动时加载
【发布时间】:2013-11-04 12:13:06
【问题描述】:

我有一个网格链接到带有autoLoad: true 的商店。问题是商店会在应用程序启动时加载,即使视图是稍后通过菜单访问时才创建的。

我已经在 Application.js 和视图中引用了商店,但我没有明确地实例化商店和视图。

我不知道如何实现仅在视图需要时才加载商店。

  • 如果我设置autoLoad: true,商店会在应用程序启动时加载。
  • 如果我设置autoLoad: false,则商店根本不会加载。

我知道这是非常基本的,但到目前为止我被困住了。


以下是所有相关代码供参考:
应用/商店/Owners.js

Ext.define('Mb.store.Owners', {
    extend: 'Ext.data.Store',
    model: 'Mb.model.Owner',
    autoLoad: true,
    proxy: {
        ...
});

应用程序.js

Ext.define('Mb.Application', {
    name: 'Mb',
    extend: 'Ext.app.Application',
    models: [
        'Owner'
    ],
    stores: [
        'Owners'
    ],
    ...

app/view/Owners.js

Ext.define('Mb.view.winbiz.Owners', {
    extend: 'Ext.grid.Panel',
    alias: 'widget.test-gridPanel',
    store: 'winbiz.Owners',
    columns: [{
    ...

视图在控制器中实例化:

Ext.define('Mb.controller.Winbiz', {
    extend: 'Ext.app.Controller',
    views: [
        'Owners'
    ],
    init: function(){
        this.control({
            'menu #test': {click: this.onMenuTest},
        })
    },
    onMenuTest: function(){
        this.getController('Main').addToMainTab('test-gridPanel');
    },

【问题讨论】:

    标签: extjs extjs4 extjs4.2 extjs-stores


    【解决方案1】:

    这是我的最终控制器代码:

    Ext.define('Mb.controller.Winbiz', {
        extend: 'Ext.app.Controller',
        views: [
            'Owners'
        ],
        refs: [{ref: 'testGrid', selector: 'test-gridPanel'}],
        init: function(){
            this.listen({
                store: {
                    '#Owners':{ load: this.onOwnersLoad}
                }
            })
            this.control({
                'menu #test': {click: this.onMenuTest},
                'test-gridPanel': {render: this.onOwnersRender}
            })
        },
        onMenuTest: function(){
            this.getController('Main').addToMainTab('test-gridPanel');
        },
        onOwnersLoad: function(store){
            store.loaded = true
        },
        onOwnersRender: function(){
            var store = this.getTestGrid().getStore();
            if(!store.loaded)store.load();
        },
    

    它按照@pcguru 的建议将所有代码放入控制器中,并按照@Lolo 的建议使用渲染事件来缩短代码。谢谢

    【讨论】:

    • .loaded 未在您的代码中设置,它将始终加载商店。
    • @pcguru 你是对的。所以这意味着没有办法知道商店是否已经加载,除非在商店加载时将其存储在变量中?
    • @pcguru 我更新了我的代码来纠正这个问题。现在它并不比你的短:(
    • :) 但是如果更长的代码可以正常工作并且更可重用和高效,特别是如果它比更短的代码更容易阅读和理解,imo 会更好。有人可能会争辩说,加载应该是一项内置功能。但是可以轻松地为 Ext.data.Store 创建一个覆盖 - 因此您不必为每个存储重复此操作 - 如果这样做,您可以从该控制器中删除加载的部分。
    【解决方案2】:

    我会让视图的控制器处理存储负载。

    首先禁用商店的自动加载。

    Ext.define('Mb.controller.Winbiz', {
        extend: 'Ext.app.Controller',
        views: [
            'Owners'
        ],
        ownerStore: null,
        init: function(){
            this.control({
                'menu #test': {click: this.onMenuTest},
            });
    
            this.ownerStore = Ext.getStore('winbiz.Owners');
        },
        onMenuTest: function() {
            if (this.ownerStore.loaded === false) {
                this.ownerStore.load(
                    scope: this,
                    callback: this.onOwnerStoreLoaded
                );
            }
            else {
                this.addToTab();
            }            
        },
        onOwnerStoreLoaded: function (store, records, successful, eOpts) {
            if (successful) {
                store.loaded = true;
                this.addToTab();
            }
        },
        addToTab: function () {
            this.getController('Main').addToMainTab('test-gridPanel');
        }
    

    要在加载商店之前还是之后更改视图是另一个问题。

    【讨论】:

    • 你是对的,代码应该进入控制器并且不应该重新加载商店。你的代码有点长。我会尽量缩短。
    【解决方案3】:

    您可以添加render 处理程序以查看将调用存储load 方法并禁用autoLoad

    监听器示例:

    Ext.define('Mb.view.winbiz.Owners', {
        extend: 'Ext.grid.Panel',
        [...],
    
        initComponent: function(){
            this.callParent();
            this.on('render', this.loadStore, this);
        },
    
        loadStore: function() {
            this.getStore().load();
        }
    });
    

    【讨论】:

    • 谢谢,这是完美的解决方案。
    • 我不喜欢视图中的代码。如果您的代码应该由视图中的控制器负责,则没有理由使用控制器。此解决方案还会在每次渲染视图时重新加载商店 - 可能没有必要?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多