2016-07-07 8 views
1

Я - разработчик ExtJS (я использую версию 5.1), и я пытаюсь разделить монолитное однофайльное приложение в разных файлах. Я переместил магазин в отдельный файл. Это магазин в отдельном файле:EXTJS Расширение Ext.data.JsonStore

Ext.define("MT.store.MicroProfilerStore", { 

    extend: "Ext.data.JsonStore", 

    singleton : true, 
    model : 'MT.model.MicroProfilerModel', 
    storeId: "micro_profiler_store", 
    autoLoad: false, 
    proxy: { 
     type: 'ajax', 
     url: './backend/profiler.php', 
     reader: { 
      type: 'json', 
      rootProperty: 'answers' 
     } 
    } 
}); 

Если я использую этот файл на основе AJAX запрос правильно и я могу видеть ответ, но это выглядит как магазин игнорирует rootProperty и вместо того, чтобы массив ответов в store.getData() у меня есть один массив элемента с первым значением, весь ответ преобразуется в Javascript, как:

[{success: 'true', answers: [{}, {}]}] 

Но если я создаю магазин непосредственно без подклассов, используя Ext.create ("Ext .data.JsonStore ", {...}) он работает!

Рубить, что я нашел после того, как день пытаясь, что позволяет мне держать отдельный файл для магазина заключается в следующем:

Ext.define("MT.store.MicroProfilerStore", function(){ 
    Ext.require(['MT.model.MicroProfilerModel'], function(){ 
     Ext.create("Ext.data.JsonStore", { 
      singleton : true, 
      model : 'MT.model.MicroProfilerModel', 
      storeId: "micro_profiler_store", 
      autoLoad: false, 
      proxy: { 
       type: 'ajax', 
       url: './backend/profiler.php', 
       reader: { 
        type: 'json', 
        rootProperty: 'answers' 
       } 
      } 
     }); 
    }); 

    return {}; 
}); 

Тогда я могу получить в магазин, используя StoreManger.lookup(). Хорошо, он работает нормально, но вопрос в том, почему?

PS Я уже пробовал поджимать модель до магазина, в явной форме требует модели и магазина во многих местах он не выглядит как ошибка старшинства

Спасибо за вашу помощь

+1

Не расширяйте JsonStore, просто расширяйте Store. Кроме того, почему вы объявляете его одиночным? –

+0

Спасибо, используя Store вместо JsonStore, он работает, но почему? Я создал синглтон, потому что мне сложно, что мне нужно один магазин этого типа во всем моем приложении. – wezzy

ответ

1

Мы есть много магазинов, которые могут быть сделаны singleton, но кажется, что singleton:true не является частью лучших практик ExtJS.

Если нам нужен «однотонный магазин», который, как и 90% времени, мы по-прежнему делаем обычное хранилище, но добавляем это хранилище в массив магазинов в Application.js, чтобы экземпляр был создан до применения запуск. То, что делает хранилище singleton, является storeId, по которому на нем ссылаются повсюду. Все наши одноэлементные магазины определяются с помощью специальной конструкции конструктора/callParent, потому что мы не получили читатель rootProperty работать иначе:

Ext.define('MyApp.store.Directories',{ 
    extend: 'Ext.data.Store', 
    storeId: 'DirectoryStore', 

    constructor: function() { 
     var me = this; 
     this.callParent([{ 
      proxy: { 
       type: 'ajax', 
       headers:{'Accept':'application/json'}, 
       noCache: true, 
       pageParam: false, 
       startParam: false, 
       limitParam: false, 
       extraParams: { 
        q: 'directory' 
       }, 
       url: '../api/AddressBook', 
       reader: { 
        type: 'json', 
        rootProperty: 'data' 
       } 
      }, 
      autoLoad: true 
     }]); 
    } 
}); 

специальный конструктор/callParent часть делает разницу здесь. Мы точно не знаем, ПОЧЕМУ он работает, но он работает - мы скопировали этот подход из кода, созданного Sencha Architect. Если нам нужно содержание этого магазина в любом месте, мы делаем следующим образом:

xtype:'combo', 
name:'Directory', 
store:'DirectoryStore' // <- reference by storeId! 

Ссылка StoreID терпит неудачу, если мы не добавить магазин в массив магазинов в Application.js, где мы должны сохранить список всех «одноточечного ":

Ext.define('MyApp.Application', { 
    extend: 'Ext.app.Application', 
    name: 'MyApp', 

    views: [ 
     /* Allgemein */ 
     ... 
    ], 
    controllers: [ 
     'Configuration', 
     ... 
    ], 
    stores: [ 
     'Directories', 
     ... 
    ] 
+0

Спасибо за ваш ответ! Я отказался от идеи иметь одноэлементный магазин, это были просто улучшения, но ненужные и путем подкласса Ext.data.Store, а не Ext.data.JsonStore, он работает правильно. Я не знаю, почему я не могу подклассифицировать JsonStore напрямую, но это не соответствует. Еще раз спасибо за разъяснение – wezzy

+0

Загляните в код 'JsonStore.js' и подумайте о том, что происходит и когда. – Alexander