我試圖環繞model
財產或與控制器的content
財產的路線我的頭。如果您在路由中設置model
屬性,是否會自動將其設置爲生成的控制器中的content
屬性?Ember.js路由器/控制器屬性
另外,我覺得控制器的content
屬性允許您訪問的模板對象的屬性,是真的嗎?
我閱讀文檔,仍然我有麻煩消化一些約定。
我試圖環繞model
財產或與控制器的content
財產的路線我的頭。如果您在路由中設置model
屬性,是否會自動將其設置爲生成的控制器中的content
屬性?Ember.js路由器/控制器屬性
另外,我覺得控制器的content
屬性允許您訪問的模板對象的屬性,是真的嗎?
我閱讀文檔,仍然我有麻煩消化一些約定。
如答覆here,Ember.Route
有一個model
函數,它允許您設置一個對象或一組對象作爲該路線的模型。處理單個對象的路由應該有一個控制器,該控制器可以擴展Ember.ObjectController
,而處理對象集合的路由應該有一個控制器,該控制器可以擴展爲Ember.ArrayController
。 隨後,在Route
工作流,從model
鉤來的數據經由setupController
鉤設置到控制器的content
屬性。
的航線都有自己的工作流程,建立自己的控制器,因此默認情況下此方法將被調用,並使用該模型的內容。考慮以下幾點:
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);
}
...
});
存在這樣的情況(見上面鏈接提問/回答)中,你可能需要/想重寫這些方法做一些比默認的功能不同,例如:
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}}
不起作用)。在這種情況下,最好的行動方案是控制器中的一個計算屬性,它可以讓您直接訪問電子郵件的第一個消息收集項(如果有的話)。
這是我見過的最好的答案!非常感謝花時間來解釋。 – brandonhilkert 2013-04-09 15:08:45
你的答案解釋得比指南好得多 – ahnbizcad 2015-03-27 08:33:39
您是否看過任何介紹截屏視頻,展示如何使用路線/視圖/控制器/模型?我在一個月前做了一個,在36分鐘內涵蓋了基礎知識http://toranbillups.com/blog/archive/2013/03/02/emberjs-rc1-introduction-screencast/ – 2013-04-09 13:43:52
我還沒有見過這樣的一個。我看過這個(http://www.youtube.com/watch?v=7O9X5oeAJm4),它真的幫助我瞭解事物的整體結構。我會檢查這一個。謝謝! – brandonhilkert 2013-04-09 14:05:09