Вложенный массив Sproutcore один-ко-многим - PullRequest
0 голосов
/ 01 июля 2011

У меня есть три уровня объектов, каждый как один ко многим.Мне бы хотелось, чтобы при выборе другой записной книжки элементы представления страницы и столбца получали каскадные обновления.

Записная книжка> Страницы> Столбцы

С помощью notebooksController и notebookController я могу связать

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 ]

1 голос
/ 01 июля 2011

Если у вас есть один ноутбук, попробуйте

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
});
0 голосов
/ 01 июля 2011

Я нашел ответ. Оказывается, вы действительно можете просто использовать 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]}
];
...