2013-04-09 121 views
2

我試圖環繞model財產或與控制器的content財產的路線我的頭。如果您在路由中設置model屬性,是否會自動將其設置爲生成的控制器中的content屬性?Ember.js路由器/控制器屬性

另外,我覺得控制器的content屬性允許您訪問的模板對象的屬性,是真的嗎?

我閱讀文檔,仍然我有麻煩消化一些約定。

+2

您是否看過任何介紹截屏視頻,展示如何使用路線/視圖/控制器/模型?我在一個月前做了一個,在36分鐘內涵蓋了基礎知識http://toranbillups.com/blog/archive/2013/03/02/emberjs-rc1-introduction-screencast/ – 2013-04-09 13:43:52

+0

我還沒有見過這樣的一個。我看過這個(http://www.youtube.com/watch?v=7O9X5oeAJm4),它真的幫助我瞭解事物的整體結構。我會檢查這一個。謝謝! – brandonhilkert 2013-04-09 14:05:09

回答

7

如答覆hereEmber.Route有一個model函數,它允許您設置一個對象或一組對象作爲該路線的模型。處理單個對象的路由應該有一個控制器,該控制器可以擴展Ember.ObjectController,而處理對象集合的路由應該有一個控制器,該控制器可以擴展爲Ember.ArrayController。 隨後,在Route工作流,從model鉤來的數據經由setupController鉤設置到控制器的content屬性。

的航線都有自己的工作流程,建立自己的控制器,因此默認情況下此方法將被調用,並使用該模型的內容。考慮以下幾點:

fiddle

App.Email = DS.Model.extend({ 
    address: DS.attr('string'), 
    isActive: DS.attr('boolean') 
}); 

App.Router.map(function() { 
    this.resource('emails', function() { 
     this.route('email', {path: ':email_id'}); 
    }); 
}); 

App.EmailsRoute = Ember.Route.extend({ 
    model: function() { 
     return App.Email.find(); 
    } 
}); 
App.EmailRoute = Ember.Route.extend({ 
    model: function(params) { 
     return App.Email.find(params.email_id); 
    } 
}); 

App.EmailsController = Ember.ArrayController.extend(); 
App.EmailController = Ember.ObjectController.extend(); 

框架應生成這些路由的默認代碼,以設置控制器,它應該是這樣的(你可以重寫,如果你想):

App.EmailsRoute = Ember.Route.extend({ 
    ... 
    setupController: function(controller, model) { 
     controller.set('content', model); 
    } 
    ... 
}); 

存在這樣的情況(見上面鏈接提問/回答)中,你可能需要/想重寫這些方法做一些比默認的功能不同,例如:

fiddle

App.EmailsRoute = Ember.Route.extend({ 
    model: function(params) { 
     return [{id: 1, address: '[email protected]'}]; 
    }, 
    setupController: function(controller, model) { 
     // here, controller is whatever controller this route needs 
     // by conventions, it knows it should be EmailsController 
     // of the type ArrayController 
     // model is whatever was returned by the model function above 

     // the content is a "bag" which can be filled with a model or any 
     // other object you need. Just keep in mind your view layer will 
     // be referring to this object later on 
     controller.set('content', model); 

     // you can set other properties of the controller here too 
     controller.set('applyFilter', true); 
    } 
}); 

現在模板將能夠訪問控制器的數據。下面的示例遍歷EmailsController中的一組對象(App.Email)。在此集合或其子對象的任何公共屬性在這裏訪問的,一個例子是{{email.address}}

<script type="text/x-handlebars" data-template-name="emails"> 
    <ul> 
    {{#each email in controller}} 
     <li> 
      {{#linkTo emails.email email}} 
       {{email.address}} 
      {{/linkTo}} 
     </li>  
    {{/each}} 
    </ul> 
    {{outlet}} 
</script> 

注意,模板不直接對話的模式,而是在content,這與數據分配來自模型。就像我所說的,你可以通過路由存儲內容或模型中的任何對象,所以你不會束縛於使用DS.Model,也沒有強烈的耦合架構。

如果這種模式,而不是App.Email類型,有不同的類型有不同的屬性,它也可以訪問這裏,有限制壽。如果模型的屬性是集合,則無法通過索引訪問它(例如{{email.messages[0].body}}不起作用)。在這種情況下,最好的行動方案是控制器中的一個計算屬性,它可以讓您直接訪問電子郵件的第一個消息收集項(如果有的話)。

+1

這是我見過的最好的答案!非常感謝花時間來解釋。 – brandonhilkert 2013-04-09 15:08:45

+0

你的答案解釋得比指南好得多 – ahnbizcad 2015-03-27 08:33:39