2013-01-23 204 views
5

玩弄燼,我發現有時模型存儲在控制器的content屬性,有時該模型也可以在控制器上直接使用。但是,我不明白,當情況如此。從模板訪問模型

讓我通過組裝我的ember MVC時找到的示例來解釋它。

設置A - 起始

  • 我定義的自定義對象Member,對應MemberRouteMemberView類和模板的名稱member
  • Member對象具有諸如idnickname
  • 一些屬性:無形式MemberController的控制器被定義,從而通過燼的慣例,它提供了它自己的控制器。

設定B - 定製

  • 一樣設置一個,但現在有定義的MemberController包含從模板中引發的一些操作方法。

奇怪行爲(分別是什麼我不完全理解)

  • 在設置A,可以參考我的Member的直接{{id}}{{nickname}}屬性。
  • 在設置B,我必須使用{{content.id}}{{content.nickname}}

由於Ember的文檔中記載,MemberView確實

setupController : function(controller, member) { 
    controller.set('content', member); 
}, 

所以,可能有人幫助我理解爲什麼差異和區別在哪裏是什麼?目前,我的猜測是,要麼

  • ,模板的背景是不同的(可能是一個代碼塊在控制器的設置丟失?)

  • 由自動提供的默認控制器,它具有一些額外的魔法,不能直接用於定製控制器。

任何幫助理解這一點是高度讚賞。它已經花了我很長一段時間才能達到這一點。我首先想到它可能是由項目設置與requireJS引入的模塊化(嗯,我仍然認爲這可能會產生影響)。 Ember是v1.0pre4。

在此先感謝! Patrick

回答

8

那麼,有人可以幫助我理解爲什麼差異和差異在哪裏?目前,我的猜測是 模板的上下文不同(可能是控制器設置中缺少一個代碼片段?) 或 由自動提供的默認控制器,有一些額外的魔術不能直接用於定製控制器。

很難肯定地說,沒有看到你的代碼,但我最好的猜測是,你MemberController延伸Ember.Controller。由ember提供的默認值(在這種情況下)應該是Ember.ObjectController。如果這是你想要的,你MemberController定義修改爲:

App.MemberController = Ember.ObjectController.extend({ 
    myProperty: 'value' 
}); 

的objectController充當代理,它是content財產,通常是灰燼模型。因此,如果事情正確連接起來,您絕不需要通過'content'屬性訪問模型。如果你看到類似的東西:

{{content.id}} or {{content.nickname}} 

這是一個跡象,你應該改變一個ObjectController。見EMBER GUIDES: REPRESENTING A SINGLE MODEL!以獲得更詳細的解釋。

+0

完美,謝謝邁克爾。這不僅是解釋,而且在我的代碼中出了什麼問題。我有'App.MemberController = Ember.Controller.extend({});'。至少這個錯誤讓我們更好地理解控制器。 thx再次!已經標記爲ph –

0

ObjectController充當設置爲控制器內容的對象的代理。當沒有定義控制器時,Ember將爲您創建一個控制器,並將其內容默認設置爲model() function(如果已定義)返回的路徑中的任何對象。無論您是定義自己的控制器還是讓Ember爲您定義一個控制器,其行爲都應該相同

模板中的默認上下文是控制器本身,即this = an instance of your controller or the generated one。當您試圖在該上下文中訪問暱稱時,Ember將首先嚐試根據控制器本身來解析它,如果沒有發現任何東西,它會根據其內容解析它,即如果您已經手動將其設置爲控制器的內容,則會將其解析。

最後,Route中沒有默認的model() function實現,除非你使用動態url,say /foo/id that resolves against /foo/:id,Ember使用提供的id來加載一個提供了id的Foo對象,從而提供了默認實現給model()函數。最後它歸結爲相同的機制,只是爲了您的方便而自動化。

我建議您聽聽this瞭解更多關於Ember如何爲您自動完成的事情。但是當涉及到正在顯示的內容時,您不得不手動連線控制器的內容。

+0

,邁克爾真的明白了。但是,謝謝你的解釋和有趣的談話。 –