2012-08-16 1 views
11

Hat jemand Ember-Daten verwendet, um einen Baum von Daten zu modellieren?Ember-Daten rekursiv hasMany association

Ich würde davon ausgehen, es wäre so etwas wie:

Node = DS.Model.extend({ 
    children: DS.hasMany(Node), 
    parent: DS.belongsTo(Node) 
}); 

Allerdings habe ich diese Arbeit nicht in der Lage zu erhalten, die zu glauben, zu führt, dass entweder: 1) ich einfach falsch bin, wie ich setze dies auf, oder 2) es ist derzeit nicht möglich, einen Baum anhand von Glutendaten zu modellieren.

Ich hoffe, dass es die ehemaligen ist und nicht diese ...

Natürlich könnte es die JSON ... Ich gehe mal davon aus das JSON der Form sein sollte:

{ 
    nodes: [ 
     { id: 1, children_ids: [2,3], parent_id: null }, 
     { id: 2, children_ids: [], parent_id: 1 }, 
     { id: 3, children_ids: [], parent_id: 1 } 
    ] 
} 

Alle Tipps/Hinweise für dieses Problem würden sehr geschätzt werden.

+0

Was funktioniert nicht genau? Könnten Sie bitte etwas Code zu Ihrer Frage hinzufügen, um uns das Problem zu zeigen? –

+0

Sicher, ich habe ein einfaches [jsFiddle-Beispiel] (http://jsfiddle.net/heuristocrat/5aqHx/) eingerichtet, das zeigt, wie ich glaube, dass ich das Modell definieren und dann nach einem Stammknoten suchen und versuchen sollte, darauf zuzugreifen die Kinder (wo die Dinge zusammenbrechen). – Heuristocrat

+0

Das ist eine nützliche Geige. Ich hatte ähnliche Probleme in einer nicht-rekursiven hasMany, also bin ich daran interessiert, irgendwelche Lösungen zu sehen. – pjmorse

Antwort

14

Es gibt mehrere kleine Dinge, die Ihre Geige verhindern zu arbeiten:

  • die DS.hasMany Funktion fragt nach einem String als Argument. Vergessen Sie nicht, die Zitate: DS.hasMany('Node')

  • in der Halterung Definition sollte hasMany Beziehungen nicht durch _ids oder etwas nachgestellt werden. Verwenden Sie einfach den einfachen Namen. Zum Beispiel: { id: 42, children: [2,3], parent_id: 17 }

  • die length Eigenschaft DS.ManyArray sollte mit der get Funktion zugegriffen werden: root.get('children.length')

  • standardmäßig simuliert die Befestigungsadapter einen Ajax-Aufruf. Die Abfrage find füllt den Datensatz nach dem Warten auf 50ms auf. In Ihrer Geige kommt der Anruf root.get('children.length') zu früh.Sie können das Gerät Adapter so konfigurieren, dass es synchroner Aufruf macht:

    App.store = DS.Store.create({ 
        revision: 4, 
        adapter: DS.FixtureAdapter.create({ 
         simulateRemoteResponse: false 
        }) 
    }); 
    

    Oder Sie können ohne Adapter Daten in den Speicher laden:

    App.store.loadMany(App.Node, [ 
        { id: 1, children: [2, 3] }, 
        { id: 2, children: [], parent_id: 1 }, 
        { id: 3, children: [], parent_id: 1 } 
    ]); 
    
  • und zuletzt: es scheint, wie die Ember App im globalen Bereich (keine var) und Ember-Datenmodelle erklärt werden sollten in dem App Umfang deklariert werden (als Ersatz für var Node = ... durch App.Node = ...)

soll

Voll Beispiel:

App = Ember.Application.create(); 

App.store = DS.Store.create({ 
    revision: 4 
}); 

App.Node = DS.Model.extend({ 
    children: DS.hasMany('App.Node'), 
    parent:   DS.belongsTo('App.Node') 
}); 

App.store.loadMany(App.Node, [ 
    { id: 1, children: [2, 3] }, 
    { id: 2, children: [], parent_id: 1 }, 
    { id: 3, children: [], parent_id: 1 } 
]); 

var root = App.store.find(App.Node, 1); 

alert(root.get('children')); 
alert(root.get('children.length')); 
+0

unter der Annahme, App.Node hat ein Attribut "name", ist es möglich, über alle Kinder in einer Vorlage wie folgt zu iterieren: {{# jedes Kind in controller.children}} {{child.name}} {{/ each}} ? – lipp

+0

Wie würden Sie einen Knoten löschen, ohne auf eine unendliche Rekursion zu stoßen? Ich stehe derzeit vor diesem Problem. –

-3

nicht sicher, aber wie pro Beispiel in ember Führungs

gegeben
App.Post = DS.Model.extend({ 
    comments: DS.hasMany('App.Comment') 
}); 

Die JSON sollte die Beziehung als ein Array von IDs kodieren:

{ 
    "post": { 
    "comment_ids": [1, 2, 3] 
    } 
} 
1

Diese didn Ich arbeite für mich, bis ich die Umkehrung eingerichtet habe:

App.Node = DS.Model.extend({ 
    children: DS.hasMany('App.Node', {inverse: 'parent'}), 
    parent: DS.belongsTo('App.Node', {inverse: 'children'}) }); 
+0

Es scheint nicht zu funktionieren in ember-data 1.0.0-beta.7 (letzte Version). Hat jemand das in den neuesten Versionen gelöst? – Gorzas