ContactItemViewでContentViewを直接呼び出すのではなく、イベントを使用してイベントをフックすることをお勧めします。ビューを作成しているときに、各親ビューを子ビューのイベントにバインドできます。次に、クリックが発生すると、適切なビューがそれを処理するまで、チェーンを介してバブルします。
一般的な考え方を示す簡単な例を次に示します。これは、イベントのバブリングが発生する順序で示しています。これは、少し明確になることを願っています。
まず、ContactItemViewはDOMクリックイベントを取得し、そのバックボーンイベントをトリガーします。
//ContactItemView.js
events : {
"click .contactName" : "click"
},
click : function(evt){
this.trigger("clicked", this);
}
ContactListViewはそれをリッスンし、再公開できます。
//ContactListView.js
render : function(){
var itemView = new ContactItemView();
itemView.on("clicked", this.itemClicked, this);
},
itemClicked : function(item){
this.trigger("clicked", item);
}
SidebarViewはそのイベントをリッスンし、実際にそれをどう処理するかを知っています。
//SidebarView.js
render: function(){
var listView = new ContactListView();
this.contentView = new ContentView();
listView.on(clicked, this.contactItemClicked, this);
},
contactItemClicked : function(contactItem){
this.contentView.showMeAContact(contactItem.model); //or whatever
}
このように、ContactItemViewは親ビューについて何も認識しないため、より柔軟になります。欠点は、ボイラープレートコードがたくさんあることです。たぶん他の誰かがよりクリーンなアプローチをとるでしょうが、これは私にとってはトリックです。