ember.js动态路由问题

时间:2013-05-08 18:58:27

标签: ember.js ember-data ember-router

我有相同的App.User和App.Contact模型并且从基类继承:

App.Person = DS.Model.extend({
    firstName: DS.attr('string'),
    surname: DS.attr('string'),   
    email: DS.attr('string'),
    fullName: function(){
        return this.get('firstName') + " " +  this.get('surname');
    }.property('firstName', 'surname'),
});

App.Contact = App.Person.extend({
});

App.User = App.Person.extend({
});

我想以某种方式将这些对象传递给一条允许我自动发送电子邮件的新路线。我有一个邮件对象,将该人称为多态关系:

App.Mail = DS.Model.extend({
    recipients: DS.hasMany('App.Person', {polymorphic: true}),
});

我所遇到的问题显示在这个小提琴中here

由于某种原因,该模型未在App.MailPersonRoute路线中设置,我对其原因感到困惑。

1 个答案:

答案 0 :(得分:3)

因为你的路由器有嵌套路由:

App.Router.map(function() {
    this.resource('mail', function(){
        this.route('person', {path: 'person/:person_id'}); 
    });
});

您正在创建{{linkTo}}将嵌套路由名称传递为mail.person

<script type="text/x-handlebars" data-template-name="index">
  {{#each model}}
    <p>Mail to {{#linkTo mail.person this}}{{fullName}}{{/linkTo}}
  {{/each}}
</script>

这也必须反映到您的模板名称(根据conventions),特别是与该路线相关的模板。目前你有:

<script type="text/x-handlebars" data-template-name="mail">
    in mail with {{email}}
</script>

应该是:

<script type="text/x-handlebars" data-template-name="mail/person">
    in mail with {{email}}
</script>

嵌套路由在其键名中包含其父资源的名称,而资源在其名称中没有父资源,即使它们是在另一个资源下声明的。


注意:不是必需的,但您可能希望将serialize更改为类似或更优雅的以下内容:

serialize: function(model){
    var _personType = 'contact';
    if(model instanceof App.User) {
        _personType = 'user'
    }
    return {
        person_type: _personType,
        person_id: model.get('id')
    };
}

此更改还需要定义类似于以下内容的路径:

App.Router.map(function() {
    this.resource('mail', function(){
        this.route('person', {path: ':person_type/:person_id'}); 
    });
});

如果您同时拥有相同ID的用户和联系人,那么像这样实施会阻止您的链接的href相等。在当前状态下,如果您访问其中一个链接,浏览器会认为这两个链接都已访问过。同样,不是要求或任何事情。