2013-03-23 4 views
5

Ich habe ein Modell Category, die viele Documents hat. Beim Rendern einer Person Category möchte ich alle untergeordneten documents in einer sortierbaren Liste per Drag & Drop auflisten. Ich möchte auch einen Doppelklick auf eine beliebige Person document, um Inline-Bearbeitung für das Dokument zu ermöglichen.Emberjs - Mit CollectionView und ItemController zusammen

Ich habe beide Teile arbeiten auf eigene, aber kann nicht scheinen, herauszufinden, wie Sie sie zusammenführen.

Für die sortierbare Liste verwende ich eine benutzerdefinierte Unterklasse von CollectionView, um die documents zu rendern, und nach dem Einfügen des Elements rufe ich das html5sortable jquery-Plugin auf.

Für die Inline-Bearbeitung habe ich einen itemController für jede document gerendert gesetzt. Innerhalb der DocumentController hielt ich Bewerbungsstatus der Bearbeitung des Dokuments.

Ich bin auf der Suche nach einem Einblick, wie Sie die beiden Ansätze kombinieren. Was ich denke, ich brauche, ist eine Möglichkeit, eine itemController für jede itemView in der CollectionView einzurichten. Ich habe den entsprechenden Code unten angegeben.

Danke für jede Hilfe. Schätze es wirklich.

Antwort

2

Das Geheimnis ist, itemController auf Ihrem ArrayController statt zu versuchen, es auf der Ansicht einzustellen. Dann werden alle Ansichten, die an diesen ArrayController binden, einen Controller zurückbekommen, und nicht der Inhalt dahinter.

App.DocumentsController = Ember.ArrayController.extend({ 
    needs: ['category'], 
    contentBinding: 'controllers.category.documents', 
    itemController: 'document' 
}); 

und dann in Ihre Kategorien:

, das zu tun, werden Sie eine explizite DocumentsController machen müssen

App.CategoryController = Ember.ObjectController.extend({ 
    needs: ['documents'] 

nun in Ihren Vorlagen, binden an controllers.documents statt documents .

+0

Dank Christen. Das alles macht Sinn, aber scheint nicht für mich zu arbeiten. Ich habe den DocumentsController implementiert, wie Sie es gesagt haben, aber wenn ich 'controller' in der' sortable-item' Vorlage protokolliere, ist der Controller immer noch der 'category' Controller. Hier ist der Aufruf, die CollectionView zu verwenden: {{view App.SortableView contentBinding = "controller.documents"}} Fehle ich etwas? – raytiley

+0

innerhalb der einzelnen Ansicht, die Sie "Inhalt" verweisen möchten. Was passiert, ist, dass der 'DocumentsController' transparent einen' DocumentController' zurückgibt, der um jedes 'Dokument' gewickelt ist. Die 'CollectionView' ist sich dessen nicht bewusst und kümmert sich nicht darum: Sie setzt den Wert, den sie erhält, auf' content'. Wenn Sie möchten, können Sie 'controller' an die' content' -Eigenschaft in Ihrer itemView-Klasse binden. –

+0

Danke Christopher. Ich muss immer noch etwas Offensichtliches vermissen. In meiner Vorlage/Ansicht, wenn ich Inhalt abmelde eine Instanz von App.Document, nicht App.DocumentController, so aus irgendeinem Grund der Documents Controller ist immer noch nur das Dokument, nicht das Steuerelement umhüllt Dokument. Ich werde versuchen, den Code zu manipulieren, den ich habe. Vielen Dank für Ihre Zeit. – raytiley