web-dev-qa-db-ja.com

extjs-autoload trueのストアは、アプリケーションの起動時にロードされるべきではありません

autoLoad: trueでストアにリンクされたグリッドがあります。問題は、メニューからアクセスしたときにビューが後で作成された場合でも、アプリケーションの起動時にストアが読み込まれることです。

Application.jsとビューでストアを参照しましたが、ストアもビューも明示的に記述していません。

ビューで必要な場合にのみストアが読み込まれるようにする方法がわかりません。

  • autoLoad: trueを設定すると、アプリケーションの起動時にストアが読み込まれます。
  • autoLoad: falseを設定すると、ストアがまったく読み込まれません。

これはかなり基本的なことですが、今のところ行き詰まっています。


参照用のすべての関連コードは次のとおりです。
app/store/Owners.js

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

Application.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');
    },
8
Lorenz Meyer

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();
    }
});
7
Krzysztof

ビューのコントローラーにストアの負荷を処理させます。

ストアで自動ロードを無効にすることから始めます。

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

ストアがロードされる前と後にビューを変更するかどうかは、別の質問です。

1
oldwizard

これが私の最終的なコントローラーコードです。

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によって提案されたようにrenderイベントを使用してコードを短縮します。ありがとう

0
Lorenz Meyer