2016-10-27 6 views
0

Поскольку этот thread кажется ужасно устаревшим, позвольте мне задать аналогичный вопрос. Итак, у меня есть store определяется следующим образом:ExtJS. Загрузите магазин на рендере

Ext.define('GeoServer.store.ObjectsStore', { 
    extend: 'Ext.data.TreeStore', 
    requires: ['GeoServer.model.ObjectsModel'], 
    model: 'GeoServer.model.ObjectsModel', 
    autoLoad: false, 
    proxy: { 
     type: 'ajax', 
     url: 'controller/MapsHandler.php', 
     extraParams: { 
      action: 'listObjects' 
     } 
    } 
}); 

Как вы можете видеть, он имеет autoLoad набор для false. Это потому, что я не хочу загружать десятки магазинов при загрузке страницы, я только хочу их загрузить, когда мне это нужно. Например, в этом случае мне нужно загрузить этот магазин, когда я покажу окно с treepanel внутри. Как я показывать это окно является:

Ext.create("Ext.window.Window",{ 
    title: "Objects", 
    height: size.height, 
    width: size.width, 
    constrainHeader:true, 
    layout:"fit", 
    maximizable:true, 
    items:[{ 
     xtype: 'treepanel', 
     rootVisible: false, 
     scrollable: true, 
     itemId: 'Objects', 
     store: 'ObjectsStore', 
     border: false, 
     autoLoad: true // has no effect 
    }] 
}).show(); 

Но противная вещь, что когда окно появляется в первый раз, то дерево не получает заполняется данными, даже если я вижу запрос, что сервер запущен. Однако, когда окна появляются на второе, третье и т. Д. Время, все в порядке. Итак, что такого особенного в первый раз и как правильно использовать это свойство autoLoad?

+1

Обычно я загружаю магазины в событие «boxready», используя метод store.load. Таким образом, вы также можете подключить обратный вызов для вызова при загрузке магазина. –

+0

, потому что вы назначаете автозагрузку для элемента (treepanel), а не в хранилище. Вместо этого используйте функцию load(). –

+0

@Adrian, я попробовал как события «render», так и 'afterrender', такие как:' listeners: {render: function() {this.store.load()}} ', но в этом случае я получаю некоторую ошибку библиотеки" 'r 'undefined" и снова в первый раз, когда дерево не заполнено – Jacobian

ответ

2

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

У вас есть две возможности, показать окно на магазине нагрузки:

var store=Ext.getStore('ObjectsStore'), 
     view=this.getView(); 
    view.mask('loading'); 
    store.on('load',function(){ 
     view.unmask(); 
     YourWindow.show(); 
    }); 
    store.load(); 

Или вы можете попытаться загрузить магазин на перед визуализацией слушателей:

listeners:{ 
    beforerender: function(){ 
     Ext.getStore('ObjectsStore').load(); 
    } 
} 

На мой взгляд, лучшим решением является первым , Store выполняет асинхронную загрузку, поэтому вы всегда увидите, что ваша панель дерева заполнена его нагрузкой.

+1

Спасибо! Я проверю это через минуту. – Jacobian

+0

Вы должны установить storeId в свой магазин, чтобы получить его с помощью ext.getStore –

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