2013-08-09 14 views
8

Ich habe den ganzen Tag mit meinem Kopf gegen dieses Problem geschlagen, und ich habe das Gefühl, dass ich einer Lösung nahe bin, aber ich kann es nicht einfach hinkriegen. Ich benutze Ember.js mit Ember-Data und dem Fixtures-Adapter, um eventuell zu einem REST-Adapter zu migrieren. Das grundlegende Problem ist das: Ich habe Sites und Supervisors mit einer viele-zu-viele Beziehung. Ich möchte dem Benutzer ein Auswahlfeld für ihre bestehenden Standort/Supervisor-Paarungen präsentieren, dabei sortiert, das heißt:Iterieren über Ember.js Glut-Datensatz-Arrays

  • Seite 1 - Betreuer 1
  • Seite 1 - Supervisor-2
  • Seite 2 - Betreuer 1 (denken Sie daran, viele zu viele)
  • Seite 2 - Leiter 3

ich diese beiden Ressourcen in einem einzigen Array hadern müssen, dass ich auf einen Blick übergeben kann, die erbt (oder wi Erben) von Ember.Select. Momentan versuche ich dies mit einer Methode auf dem Supervisors-Controller, die ich "flach" nenne, weil es ein flaches Array zurückgibt, das diese Beziehungen darstellt. Der Controller ist unten abgebildet. Ich verwende .find(). Then(), um die Daten zu verarbeiten, nachdem das Versprechen erfüllt wurde. Die Daten, die ich zurück bekomme, erscheinen, um alle vier meiner Fixtures zu enthalten, aber wenn ich eine der aufzählbaren Methoden auf ihnen versuche (insbesondere forEach), verhält es sich so, als hätte es nur das erste Objekt zurückgegeben. Ich habe versucht, über das Datenobjekt sowie data.get ('Inhalt') zu iterieren. Ich bin ziemlich neu in Ember, also mache ich das vielleicht sowieso falsch, aber das scheint mir sehr seltsam zu sein. Hier ist mein Code:

App.SupervisorsController = Ember.ArrayController.extend({ 
    flat: function(){ 
    return App.Supervisor.find().then(function(data){ 
     var c = data.get('content') ; 
     console.log(c) ; // <-- logs an object containing four records, 
          //  with attribute "length" showing 4 
          //  Great! (see below for log output) 

     console.log(c[0]) ; // <-- logs first record. Great! 
     console.log(c[1]) ; // <-- undefined (?!) 
     console.log(c[2]) ; // <-- undefined (?!) 
     console.log(c[3]) ; // <-- undefined (?!) 
     console.log(c.get('length')) ; // <-- 1 (not four?!) 

     return c ; // <-- eventually this will return the newly constructed array 
    }) ; 
    } 
}) ; 

Und hier ist die Protokollausgabe von der ersten console.log() aufrufen

0: Object 
1: Object 
2: Object 
3: Object 
__ember1376005434256: "ember325" 
__ember1376005434256_meta: Meta 
_super: undefined 
length: 4 
__proto__: Array[0] 

Können Sie mir sagen, was ich hier fehlt? Ich kann nicht herausfinden, wie ich auf jeden der vier resultierenden Supervisors zugreifen kann.

Danke!

+0

Haben Sie versucht, mit data.objectAt (Index) anstatt direkt über den Operator [] zuzugreifen? –

Antwort

9

Es scheint so, als würden Sie auf die Modelle zugreifen, bevor sie fertig geladen sind (Sie können dies in der Eigenschaft isUpdating sehen). Wenn du dich träge danach sehnst, kannst du später mit ember laufen, um die Gegenstände ein wenig später zu sehen. Oder Sie können das Modell auf dem Controller eingestellt und machen Sie es und lassen ember die Ansicht aktualisieren, wenn die Modelle fertig geladen sind ...

Ember.run.later(function(){ 
    data.forEach(function(item){ 
    console.log(item); 
    }); 
}, 2000); 



App.ApplicationRoute = Ember.Route.extend({ 
    activate: function(){ 
    this.controllerFor('supervisors').set("model", App.Supervisor.find()); 
    } 
}); 

http://jsbin.com/ijiqeq/12/edit

Viel Glück mit Ember!

someArray: function(){ 
    var arr = Ember.A(); 
    this.get('model').forEach(function(item){ 
    item.get('sites').forEach(function(site){ 
     arr.pushObject(someObject); //some object that is represents each specific combination 
    }); 
    }); 
}.property('model') 
+1

tat ich. Es iteriert nur einmal und protokolliert das erste Element. – Ben

+0

Entschuldigung, ich habe das im ersten Post verpasst, können Sie eine jsbin/jsfiddle erzeugen, die den Fehler zeigt? – Kingpin2k

+0

Danke, dass du dir das angeschaut hast, Daniel. Ich habe es in eine JSBIN geschrieben: http://jsbin.com/ijiqeq/3/edit. Das Ausführen in der Bin zeigt, dass das Datenobjekt vier Elemente hat, aber _alle_ Elemente zeigen Null an, wenn ich über sie iteriere. Das ist seltsam und lässt mich denken, dass das erste Element irgendwo anders in meinem Code gesetzt wurde. Nicht sicher, wie das passieren könnte. So bin ich jetzt ein wenig mehr verwirrt ... – Ben