2014-01-20 14 views
5

Ich versuche, eine Bindung an die Eigenschaft des Controllers zu machen, aber der Eigenschaftsname wird selbst als eine andere Eigenschaft des Controllers gespeichert. Ich muss an eine Eigenschaft binden, ohne den Eigenschaftsnamen zur Entwurfszeit zu kennen. Ist das möglich? Oder was ist der bessere Weg, Dinge zu tun?Wie man Lenker an willkürliche Eigenschaft bindet?

Ich mache eine Ansicht, die den Inhalt einer ArrayController als Tabelle anzeigt. Die ArrayController hat eine Liste eine Eigenschaft Namen, die angezeigt werden soll (columnsMeta). In der Vorlage schaue ich durch alle Elemente in der Steuerung, dann durchlaufen Sie alle Spalten und möchten und den Spaltenwert binden. den Eigenschaftswert zu erhalten

Ein Versuch ist ein Lenker Helfer zu machen:

Ember.Handlebars.registerBoundHelper('getProperty', function(property, obj) { 
    return obj.get(property); 
}); 

und dann in der Vorlage, den Eigenschaftsnamen und Objekt an den Helfer übergeben:

{{#each row in controller}} 
    <tr> 
    {{#each col in columnsMeta}} 
     <td>{{getProperty col.property row}}</td> 
    {{/each}} 
    </tr> 
{{/each}} 

Diese Ausgänge Der richtige Text in der Tabelle und jeder Textabschnitt wird mit metamorph Tags umgeben, aber wenn ich die Werte der Eigenschaften der Modelle ändere, wird die Vorlage nicht aktualisiert, sie scheint nicht gebunden zu sein.

Diese Notationen auch nicht funktionieren:

{{row.[col.property]}} 
{{row.[(col.property)]}} 

Das Eigentum unter dem Namen „col.property“ nicht existiert und nichts gedruckt wird.



Ich sehe, dass die glut-Tabelle Projekt verwendet contentDidChange und erstellt eine berechnete Eigenschaft in der Ansicht, welche die Vorlage, um die Zellinhalte zu füttern. Table Cell View in ember-table

Aber ist das wirklich notwendig? Gibt es weniger schwere Wege? Habe ich nur meine Syntax falsch?

danke!

+0

Haben Sie den Helfer debuggt? – Kingpin2k

+0

Worauf würde ich beim Debuggen des Helfers achten? Es wird der korrekte Name der Eigenschaft als String übergeben, zB: "id" oder "title", und das obj wird auf das Modell gesetzt. Scheint so zu funktionieren, wie ich es erwarten würde, die Metamorph-Tags sind da ... es wird einfach nicht aktualisiert, wenn Modelle geändert werden. – Noland

+0

Sorry, total vermisst den nicht aktualisierenden Teil, lesen Sie es zu früh am Morgen. Gebundene Helfer sehen die Eigenschaften, die in sie gesendet werden. Der gebundene Helfer nimmt eine dynamische Eigenschaft von einer der gesendeten Eigenschaften ab. Der gebundene Helfer beobachtet zwei Dinge, die Objektreferenz selbst und den Eigenschaftsnamen. Da sie sich nicht ändern, weiß sie nicht zu aktualisieren. – Kingpin2k

Antwort

2

Eine Lösung kann die Logik aus einem registerBoundHelper bewegen und in einen ObjectController

-Controller-Code

App.ColController = Ember.ObjectController.extend({ 
    needs: ["row"], 
    getProperty: function() { 
     return this.get('controllers.row.' + this.get('property')); 
    }.property('controllers.row.foo', 'controllers.row.bar'), //this solution may not work if one does not have a finite known set of properties to observe  
}); 

Code anzeigen:

<script type="text/x-handlebars" data-template-name="row"> 
    {{#each row in controller}} 
    <tr> 
     {{#each col in columnsMeta}} 
     {{render 'col' col}} 
     {{/each}} 
     </tr> 
    {{/each}} 
</script> 

<script type="text/x-handlebars" data-template-name="col"> 
    <td>{{getProperty}}</td> 
</script> 
+0

Ja, das ist das Problem "endliche bekannte Menge". funktioniert nicht wirklich für beliebige Namen und Anzahlen von Eigenschaften. – Noland

Verwandte Themen