Sencha Touch:在视图存储准备就绪时执行某些操作

时间:2014-08-31 14:51:57

标签: extjs sencha-touch-2.1

我有一个名为" MenuPanel"的导航视图。如下所示。

每个"孩子"记录有一个菜单,如果有多个孩子,我想直接转到现有的子菜单,否则我想显示子列表视图('子列表' xtype)。

初始化视图后,有两个选项(如果我错了,请修复我):

  1. 商店已加载
  2. 商店尚未加载
  3. 我使用isLoaded()函数处理它们,然后在未加载的情况下添加(' load')。但是,我相信有更好的方法可以做到,也许这不应该是初始化函数。

    关于最佳做法的任何想法?

    MenuPanel.js

    Ext.define('eMaliApp.view.MenuPanel', {
    
        extend: 'Ext.NavigationView',
    
        xtype: 'menupanel',
    
        requires: [
            'eMaliApp.view.child.List',
            'eMaliApp.view.shared.TodayMenu'
        ],
    
        config: {
    
            store: 'children'
    
        },
    
        initialize: function() {
    
            this.callParent(arguments);
    
            var store = Ext.getStore('children');
    
            var me = this;
            var onStoreReady = function() {
                var data = store.getData();
                console.log('store data:', data);
                console.log('me:', me);
                if (_.isEmpty(data) || data.items.length > 1) {
    
                    console.log('load children list');
                    // add view
                    var centersList = {
                        title: 'Child List',
                        xtype: 'childlist',
                        store: 'children',
                        showMenu: true
                    };
                    me.add(centersList);
    
                } else {
    
                    // today menu
                    console.log('today menu');
                };
            }
    
            if (store.isLoaded()) {
                console.log('Store is loaded');
                onStoreReady();
            } else {
                console.log('Store is NOT loaded');
                store.on('load', onStoreReady);
            }
    
        }
    
    });
    

1 个答案:

答案 0 :(得分:0)

不要在导航视图的initialize方法中添加子视图。这是业务逻辑而不是视图逻辑。

将导航视图推送到视口的控制器也应该加载商店。当商店准备就绪时,控制器应将子视图推送到导航视图。这不应该直接在onStoreReady方法中完成。

Ext.define('Test.controller.MainCtrl', {
    extend: 'Ext.app.Controller',

    config: {
        refs: {
            menuPanel: 'menupanel'
        }
    },

    start: function () {
        var menuPanel = Ext.create( 'Test.view.MenuPanel' );
        Ext.Viewport.add( menuPanel );

        var store = Test.getStore( 'children' );
        var me = this;
        store.load(function ( records, operation, success ) {
                if ( success ) {
                    me.onChildrenStoreLoaded( records );    
                } else {
                    // error handling
                }
            },
            me
        );
    },

    onChildrenStoreLoaded: function ( records) {
        var menuPanel = this.getMenuPanel();

        if ( records.lenght === 1 ) {
            console.log('today menu');
        } else {
            console.log('load children list');
            var centersList = {
                title: 'Child List',
                xtype: 'childlist',
                store: 'children',
                showMenu: true
            };
            menuPanel.push(centersList);
        }
    }
});

start方法是切入点。它只是创建导航视图并将其添加到视口。它也开始加载商店。

提供给store.load方法的匿名方法将在加载存储时执行。它将在控制器的上下文中运行(由于load方法的第二个参数)。 它只检查加载是否成功,并相应地进行委托。

onChildrenStoreLoaded会将正确的视图推送到导航视图。

如果加载商店需要一段时间,您还可以屏蔽视口并在匿名方法中取消屏蔽它。