Вложенный массив Sproutcore один-ко-многим
У меня есть три уровня объектов, каждый как один ко многим. Я хотел бы, чтобы при выборе другой записной книжки элементы представления страницы и столбца получали каскадные обновления.
Блокнот> Страницы> Колонны
С блокнотами Контроллер и блокнотКонтроллер я могу связать
App.Notebook = SC.Record.extend({
name: SC.Record.attr(String),
pages: SC.Record.toMany('App.Page', {isMaster: YES, inverse: 'notebook'})
});
App.Page = SC.Record.extend({
pageNumber: SC.Record.attr(Number),
notebook: SC.Record.toOne('App.Notebook', {isMaster: NO, inverse: 'pages'}),
columns: SC.Record.toMany('App.Column', {isMaster: YES, inverse: 'page'})
});
App.Column = SC.Record.extend({
columnNumber: SC.Record.attr(Number),
page: SC.record.toOne('App.Page', {isMaster: NO, inverse: 'columns'})
});
После этого я не могу заставить работать привязку контента для pagesController. Я хочу, чтобы содержимое pagesController, pageController, columnsController и columnController располагалось каскадно, чтобы при щелчке пользователем другой записной книжки представленные представления автоматически переключались на нужный контент.
ArrayController notebooksController
// contents filled from fixture
ObjectController notebookController
// bound to notebooksController selection
ArrayController pagesController
// contentBinding: 'notebookController.pages' does not work!
ObjectController pageController
// bound to pagesController selection
// and down to column
2 ответа
Если у вас есть один ноутбук, попробуйте
App.notebookController = SC.ObjectController.create({
// call App.notebookController.set('content', aNotebook)
// to set the content on this controller
});
App.pageController = SC.ArrayController.create({
// the notebookController is a proxy to the its content, so you dont need
// 'content' in the binding contentBinding: 'App.notebookController.pages'
// bind the list view to App.pagesController.arrangedObjects. If you look in the code
// arranged objects is a reference to the array controller itself, which has array methods
// on it
});
App.pageSelectionController = SC.ObjectController.create({
// You need to add
//
// selectionBinding: 'App.pageSelectionController.content
//
// to the collection view where you select the page
// you can do this in places to see when things change. This controller is just a proxy
// to the selected page.
selectionDidChange: function(){
console.log('page selection changed to [%@]'.fmt(this.get('content');
}.observes('content')
});
App.columnsController = SC.ArrayController.create({
contentBinding: 'App.pageSelectionController.columns'
// again, where you want to show the columns, bind to
// App.columnsController.arrangedObjects
});
Я нашел ответ. Оказывается, вы действительно можете просто использовать App.notebookController.pages.
Проблема была в том, что мои приборы не были установлены правильно. Недостаточно привязать дочерний элемент к родительскому элементу, родительский элемент должен быть сопоставлен с дочерним элементом.
У меня изначально было:
Autofocus.Notebook.FIXTURES = [
{ guid: 1, title: "Home Notebook", columnCount: 2},
{ guid: 2, title: "Work Notebook", columnCount: 2}
];
И все было исправлено, когда я сделал следующее:
Autofocus.Notebook.FIXTURES = [
{ guid: 1, title: "Home Notebook", columnCount: 2, pages: [11, 12] },
{ guid: 2, title: "Work Notebook", columnCount: 2, pages: [21, 22]}
];