2016-07-04 10 views
0

Mögliche Duplizieren arbeiten: How to set url and root dynamically in extjsChange Root von Memorys nicht

Hallo, ich habe eine einfache Memorys. Wenn ich versuchte, seinen Proxy während der Ext.Define nicht zu deklarieren, kann ich später nicht den richtigen Datenstamm abrufen, selbst wenn ich den Proxy einstelle. Mache ich etwas falsch?

Hier ist ein Testfall:

var store = Ext.create('Ext.data.Store', { 
    storeId: 'JailNames', 
    autoLoad: true, 
    fields: [ 
     { 
      name: 'name', 
      type: 'string' 
     }, 
    ], 
    data: { 
     data_regionI: [ 
        {name: "Jail 1"}, 
        {name: "Jail 2"}, 
        {name: "Jail 3"}, 
     ], 
     data_regionII: [ 
        {name: "Jail 4"}, 
        {name: "Jail 5"}, 
        {name: "Jail 6"}, 
     ], 
    }, 
    proxy: { 
     type: 'memory', 
     reader: { 
      type: 'json', 
      root: 'data_regionI' 
     } 
    } 
}) 



    store.setProxy({ 
      type: 'memory', 
      reader: { 
       type: 'json', 
       root: 'data_regionII' 
      } 
     }) 

store.load(); 
store.getAt(0).raw //still returns Jail 1 

store.getProxy().reader.root Blick durch ich die data_regionII als Wurzel zu bekommen. Warum? Vielen Dank im Voraus

Antwort

1

Wenn ich Ihren Code in eine sencha Geige von Version 4.1.1 zu kopieren, wirft es ein Uncaught TypeError: Cannot read property 'raw' of undefined, das ist das, was ich erwartet habe, weil der Laden keine Datensätze enthalten sollte, überhaupt nach dem Aufruf von load() .

gibt es viele Probleme in Ihrem Verständnis, was für ein Geschäft ist und was für ein Proxy tut:

  • Ein load Funktion des normalen Speichers wird die Proxy sagen, die Daten zu holen, sagt dem Leser Aufzeichnungen daraus zu machen, und laden Sie es in die data Eigenschaft Ihres Geschäfts, indem Sie (!) die Daten überschreiben, die Sie bei der Initialisierung definiert haben.
  • Die Ladefunktion eines Speicherspeichers soll jedoch überhaupt nichts bewirken und ist nicht für die Verwendung gedacht.
  • Ein Speicher ist nicht dafür vorgesehen, mehr als einen Speicherinhalt gleichzeitig zu speichern. (Sie können den nicht verwendeten Inhalt jedoch in einer unbenutzten (!) Eigenschaft des JavaScript-Objekts des Geschäfts speichern).
  • Ein Geschäft, egal welchen Proxy, benötigt autoLoad:true, um den Inhalt von data in den Laden zu laden - der Inhalt von data wird automatisch nach der Initialisierung als Standarddaten des Geschäfts verwendet.

Das heißt, es ist immer noch möglich, mit nur ein paar Zeilen Code zu erreichen, was Sie wollen. Sie müssen nicht alle Funktionen, die ich nur für die Lesbarkeit gemacht habe:

var store = Ext.create('Ext.data.Store', { 
    storeId: 'JailNames', 
    fields: [ 
     { 
      name: 'name', 
      type: 'string' 
     }, 
    ], 
    myData: { // custom property! 
     data_regionI: [ 
        {name: "Jail 1"}, 
        {name: "Jail 2"}, 
        {name: "Jail 3"}, 
     ], 
     data_regionII: [ 
        {name: "Jail 4"}, 
        {name: "Jail 5"}, 
        {name: "Jail 6"}, 
     ], 
    }, 
    loadRegion1:function() { 
     this.loadRegion("data_regionI"); 
    }, 
    loadRegion2:function() { 
     this.loadRegion("data_regionII"); 
    }, 
    loadRegion:function(rootProperty) { // custom function for better readability 
     this.loadRawData(this.myData[rootProperty]); // load data without proxy, but with reader! 
    }, 
    proxy: { 
     type: 'memory', 
     reader: { 
      type: 'json' 
     } 
    } 
}); 
store.loadRegion1(); 
console.log(store.getAt(0).get("name")); //returns Jail 1 
store.loadRegion2(); 
console.log(store.getAt(0).get("name")); //returns Jail 4 
+0

Ich sehe, danke für die Klarstellung, Alexander! Ich verstehe, was du damit meintest. Ups für dich! – niCad