2014-08-31 2 views
0

У меня есть вид навигации, называемый «MenuPanel», как вы видите ниже.Sencha Touch: сделайте что-нибудь, когда магазин магазина готов

В каждой записи «Ребенок» есть меню, если есть более одного ребенка, я хочу напрямую перейти к существующему дочернему меню, в противном случае я хочу показать список дочерних списков («тип списка» xtype).

После того, как вид инициализируется есть 2 варианта (FIX меня, если я ошибаюсь):

  1. магазин загружается
  2. Магазин еще не загружены

Я обрабатывать их с помощью 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); 
     } 

    } 

}); 

ответ

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, будет выполняться при загрузке хранилища. Он будет запускаться в контексте контроллера (из-за второго параметра метода загрузки). Он проверяет, была ли загрузка успешной или нет, и делегирует соответственно.

onChildrenStoreLoaded направит правильные виды на навигационный режим.

Если загрузка магазина занимает некоторое время, вы также можете замаскировать область просмотра и разоблачить ее в анонимном методе.

+0

Что такое «начало»? я не вижу метода «start» для Ext.App.Controller, я думаю, вы имеете в виду «init», правильно? – user2867106

+0

Нет, я этого не делал. Метод start - это просто воображаемая точка входа для примера. Я не знаю, как вы настроили приложение. Поэтому, если вы используете контроллер для этого, вы должны поместить исходный код в его метод init. В противном случае вы можете указать, где вы инициализируете свой навигационный режим (или где-то еще). Это зависит полностью от настройки вашего приложения. – Martin

Смежные вопросы