Mam model Category
, który ma wiele Documents
. Podczas renderowania indywidualnego Category
chcę wyświetlić listę wszystkich potomków documents
na liście do sortowania z opcją przeciągania i upuszczania. Chcę również podwójne kliknięcie na dowolnej jednostce document
, aby umożliwić bezpośrednią edycję tego dokumentu.Emberjs - Używanie CollectionView i ItemController razem
Dwie części pracuję samodzielnie, ale nie mogę wymyślić, jak je połączyć.
Dla listy do sortowania używam niestandardowej podklasy CollectionView
do renderowania documents
, a po wstawieniu elementu wywołuję wtyczkę jquery html5sortable.
Do edycji bezpośredniej ustawiam itemController
dla każdego renderowanego obiektu document
. Wewnątrz DocumentController
utrzymałem stan aplikacji edycji dokumentu.
Szukam informacji na temat łączenia obu podejść. Myślę, że potrzebuję sposobu na skonfigurowanie itemController
dla każdego itemView
w CollectionView
. Podałem odpowiedni kod poniżej.
App.SortableView = Ember.CollectionView.extend({
tagName: 'ul',
itemViewClass: 'App.SortableItemView',
didInsertElement: function(){
var view = this;
Ember.run.next(function() {
$(view.get('element')).sortable();
});
}
});
App.SortableItemView = Ember.View.extend({
templateName: 'sortable-item',
doubleClick: function() {
//This should ideally send 'editDocument' to controller
}
});
App.DocumentController = Ember.ObjectController.extend({
isEditing:false,
editDocument: function() {
this.set('isEditing', true);
},
finishedEditing: function() {
var model = this.get('model');
model.get('store').commit();
this.set('isEditing', false);
}
});
<script type="text/x-handlebars" data-template-name="category">
<h1>{{ name }}</h1>
<h2>Documents</h2>
<!-- This makes a sortable list -->
{{view App.SortableView contentBinding="documents"}}
<!-- This makes an editable list -->
{{#each documents itemController="document"}}
<!-- change markup dependent on isEditing being true or false -->
{{/each}}
<!-- How do I combine the two -->
</script>
Dzięki za pomoc. Naprawdę to doceniam.
Thanks Christoper. To wszystko ma sens, ale wydaje się, że nie działa dla mnie. Zaimplementowałem DocumentsController tak jak powiedziałeś, ale jeśli loguję się 'controller' w szablonie' sortable-item' kontroler jest nadal kontrolerem 'category'. Oto wezwanie do korzystania z CollectionView: {{view App.SortableView contentBinding = "controller.documents"}} Czy brakuje mi czegoś? – raytiley
wewnątrz indywidualnego widoku, do którego chcesz odwołać się "treść". Co się dzieje, że 'DocumentsController' w sposób przezroczysty zwraca' DocumentController' owinięty wokół każdego "dokumentu". 'CollectionView' nie wie ani nie obchodzi, że tak się dzieje: nadal ustawia wartość, z jaką wraca do' content'. Jeśli chcesz, możesz połączyć 'kontroler' z właściwością' content' w klasie itemView. –
Dzięki Christopher. Muszę przestać brakować czegoś oczywistego. W moim szablonie/widoku, jeśli wyloguję zawartość, jest to instancja App.Document, a nie App.DocumentController, więc z jakiegoś powodu Kontroler Dokumentów wciąż podaje tylko dokument, a nie dokument zawinięcia kontrolera. Spróbuję zrobić skrzypkę kodu, który mam. Dziękuję za Twój czas. – raytiley