2013-10-24 9 views
5

Ich habe seit einiger Zeit gekämpft, um zu verstehen, wie hasMany und gehört zuTo zu verwenden. Mein Verständnis ist hasMany ist eine 1: viele Beziehung und gehörtTo ist eine viele: 1 Beziehung-- beiseite: so bedeutet das, dass, wenn Sie eine hasMany Beziehung haben, eine angleTo in seinem Kindmodell benötigt wird? Ich habe mehrere Artikel darüber gelesen:ExtJS 4: Understanding hasMany und gehört zu

Noch wenn auch ein wenig verwirrt. Lassen Sie uns sagen, dass ich die folgenden Daten haben:

var data = { 
    "config": { 
    "name": "blah", 
    "id": 1, 
    "someconfig": [{ 
     "name": "Services", "tabs": [{ 
      "id": 0, "name": "Details", "layout": "hbox" 
      }, { 
      "id": 1, "name": "Sources", "layout": "hbox" 
      }, { 
      "id": 2, "name": "Paths", "layout": "hbox" 
      }, { 
      "id": 3, "name": "Ports", "layout": "hbox" 
      }, { 
      "id": 4, "name": "Levels", "layout": "hbox" 
      }, { 
      "id": 5, "name": "Notes", "layout": "hbox" 
      }] 
     }, { 
     "name": "Services2", "tabs": [{}] 
     }] 
    } 
}; 

ich ein Modell für die Konfiguration erstellen würde:

Ext.define('Config', { 
    extend: 'Ext.data.Model', 
    fields: ['name'], 
    hasMany: [{ 
    name: 'someconfig', 
    model: 'Someconfig', 
    associationKey: 'someconfig' 
    }], 
    proxy: { 
    type: 'memory', 
    data: data, 
    reader: { 
     type: 'json', 
     root: 'config' 
    } 
    } 
}); 

So können Config viele Someconfigs haben, weil die Daten aus, someconfig ein Array von Objekten ist. Hier ist das Someconfig-Modell:

Ext.define('Someconfig', { 
    extend: 'Ext.data.Model', 
    fields: [ 
    'name' 
    ], 
    hasMany: [{ 
    name: 'tabs', 
    model: 'Tabs', 
    associationKey: 'tabs' 
    }] 
}); 

Ok, gleiches Angebot. Someconfig kann viele Registerkarten haben, weil Registerkarten in den Daten ein Array von Objekten sind. Hier ist das Tabs-Modell:

Ext.define('Tabs', { 
    extend: 'Ext.data.Model', 
    fields: [ 
    'id', 
    'name', 
    'layout' 
    ], 
    belongsTo: [{ 
    name: 'tabs', 
    model: 'Someconfig', 
    associationKey: 'tabs' 
    }] 
}); 

Jetzt ist Angestroy in dort, weil ich mit dieser Eigenschaft rumfummelte. Unabhängig davon kann ich nicht auf Tabs von Someconfig zugreifen, aber ich kann auf Someconfig von Config zugreifen. Werfen Sie einen Blick auf diesen Code:

Config.load(1, { 
    success: function(record, operation) { 
    console.log(record.get('name')); // works 
    console.log(record.someconfig().getCount()); // works, gives me 2 
    console.log(record.someconfig().data.items[0].data); // only prints out name and config_id 
//  console.log(record.someconfig().tabs()); // doesn't exist 
    } 
}); 

jsFiddle: demo

Was ich möchte wissen, ist, sollte ich Registerkarten für den Zugriff auf nicht in der Lage() von someconfig(), oder missverstehe ich die Beziehungen? Wenn es Ersteres ist, wie würde ich meinen Code reparieren?

Cross-gepostet von Sencha forums.

Antwort

5

Es gibt ein paar Dinge falsch mit Ihrem Ansatz hier:

  1. Wenn Sie die Getter rufen für eine one-to-many Beziehung, Sie abrufen tatsächlich einen Verweis auf ein Speicherobjekt, die eine Reihe von verwandten Objekten enthält, so versucht, die Beziehung Tabs für den Speicher abrufen, macht keinen Sinn.
  2. Sie müssen abrufen ein Element aus der Beziehung zu speichern und dann bekommen die zugehörigen Registerkarten von Aufruf die Registerkarten Methode, die ein Speicherobjekt enthält eine Reihe von Registerkarten für diese bestimmte Instanz zurück.
  3. Wenn Sie wollen Tabs zugreifen einem der Zusammenhang Sie müssen wieder wählen Sie ein einzelnes Objekt aus diesem Geschäft, die ganze Beziehung Baum quer Sie etwas tun sollten:

Hier ist eine modified version of your code, die funktioniert. Hoffe es hilft, Ihr Problem zu lösen.

+0

Yup. Du hast genau das Recht, und das sind die Schlussfolgerungen, zu denen ich gestern gekommen bin, nachdem ich etwas mehr herumgespielt habe. Vielen Dank! – incutonez

+0

Was also interessant ist, ist, dass 'someconfig' nicht in den Daten von' record' angezeigt wird ... Ich kann nur auf 'someconfig' zugreifen, indem ich seine Methode aufruft. Das macht keinen Sinn für mich machen ... wenn die 'config' Modell hasMany' someconfig', sollte es in 'config' als eine Reihe von Modellen zeigen! – incutonez