0

3 つのオブジェクト層があり、それぞれが 1 対多です。別のノートブックが選択されたときに、ページと列ビューの要素がカスケード更新されるようにしたいと思います。

ノートブック > ページ > 列

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
4

2 に答える 2

1

単一のノートブックがあると仮定して、試してください

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
});
于 2011-07-01T12:17:19.153 に答える
0

私は答えを見つけました。実際、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]}
];
于 2011-07-01T12:19:17.633 に答える