2016-07-07 1 views
1

저는 ExtJS (저는 버전 5.1을 사용하고 있습니다) 초보자이고 다른 파일에서 모 놀리 식 단일 파일 응용 프로그램을 분할하려고합니다. 나는 외부 파일을 별도의 파일로 옮겼습니다. 이것은 별도의 파일에 저장됩니다EXTJS Extending 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' 
     } 
    } 
}); 

나는이 파일을 사용하는 경우 아약스 요청이 정확하고 내가 응답을 볼 수 있지만 가게와 rootProperty을 무시하고 대신 답변의 배열을 가지고있는 것처럼 보이는

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

하지만 Ext.create를 사용하여 서브 클래 싱하지 않고 직접 상점을 작성하는 경우 ("내선 다음 store.getData()에서 나는 자바 스크립트 등으로 변환 전체 응답 첫 번째 값을 단일 항목의 배열을 .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가 확장되지 않습니다. 또한, 왜 당신은 그것을 싱글 톤으로 선언하고 있습니까? –

+0

JsonStore 대신 Store를 사용해 주셔서 감사합니다. 작동하지만 왜 작동합니까? 내 모든 응용 프로그램에서이 유형의 단일 저장소가 필요하다는 것을 알기 때문에 Singleton을 만들었습니다. – wezzy

답변

1

것이

감사합니다 우선 순위 오류처럼 보이는하지 않는 많은 장소에 가게를 요하는 저장하기 전에 모델을 사전로드 해봤 우리 싱글 톤으로 만들 수있는 많은 상점이 있지만 singleton:true은 ExtJS 모범 사례의 일부가 아닌 것 같습니다.

시간의 90 %와 같은 "싱글 톤 저장소"가 필요한 경우 우리는 여전히 일반 저장소를 만들고 Application.js의 저장소 배열에 해당 저장소를 추가하여 인스턴스가 Application 전에 만들어 지도록합니다 쏘다. 저장소를 싱글 톤으로 만드는 것은 storeId이며 모든 곳에서 참조됩니다.

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 부분이 여기에 차이를 만드는 : 우리는 다른 일을 리더 rootProperty을하지 않았기 때문에 우리의 모든 싱글 매장은 특별한 생성자/callParent 건설을 사용하여 정의됩니다. 우리는 정확히 작동하는지 모르지만 작동합니다 - Sencha Architect에서 생성 한 코드에서이 방법을 복사했습니다. 우리가 지금 어디 그 가게의 내용이 필요하면 다음과 같이 우리가 할 : 우리는 우리가 "싱글의 목록을 유지해야 Application.js에 상점 배열에 저장소를 추가하지 않을 경우

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

에 storeId 참조 실패 "상점 :

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

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

답장을 보내 주셔서 감사합니다! 싱글 톤 스토어를 가지고 있다는 생각을 버렸습니다. 단지 개선되었지만 불필요한 것이었고 Ext.data.Store 대신 Ext.data.JsonStore를 서브 클래 싱하여 제대로 작동했습니다. 왜 JsonStore를 직접 서브 클래스로 만들 수 없는지 모르지만 그것은 metter가 아닙니다. 당신의 설명에 대해 다시 한번 감사드립니다. – wezzy

+0

'JsonStore.js' 코드를 살펴보고 어떤 일이 언제 일어나는지 생각해보십시오. – Alexander