2

我有相同的 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}),
});

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

由于某种原因,模型没有在 App.MailPersonRoute 路由中设置,我对为什么感到困惑。

4

1 回答 1

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>

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

<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您的链接相等。在当前状态下,如果您访问其中一个链接,浏览器会认为这两个链接都已访问。同样,不是要求或任何东西。

于 2013-05-08T19:34:21.497 回答