2013-04-09 122 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