8

で店舗にリンクされたグリッドがあり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: {
        ...
});

アプリケーション.js

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

アプリ/ビュー/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');
    },
4

3 に答える 3

1

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

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

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

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

于 2013-10-25T12:15:25.053 に答える
0

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

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 イベントを使用してコードを短縮します。ありがとう

于 2013-10-25T12:30:48.990 に答える