1

我想要{{linkTo}}/activities/:user/:by_date路线:

this.resource('activities', { path: '/activities' }, function() {
    this.route('by_date', {path: '/:user/:by_date'});
});

如果我直接将参数放入 URL 控制器行为正确,我只希望我的应用程序模板链接到这个 URL,并为这些参数设置一组合理的硬编码值。我试图通过在以下位置设置一个实例变量来做到这一点ApplicationController

activityDefaults: {user:1, by_date:"2013-07-01"}

我认为在应用程序模板中有linkTo:

{{#linkTo "activities.by_date" activityDefaults}}Activities{{/linkTo}}

不幸的是,这不起作用,将 URL 解析为:

/activities/undefined/undefined

任何和所有的帮助将不胜感激。

-=-=-=-=-=-=-=-=-=-= 更新 -=-=-=-=-=-=-=-=-=-=-=

我试过制作activityDefaults一个 Ember 对象:

module.exports = activityDefaults = Ember.Object.create({
    user_id: 1, 
    by_date: "2012-07-12"
});

然后我添加了一个序列化程序ActivitiesByDateController

serialize: function(model) {
    return {
        user_id: model.get('user_id'), 
        by_date: model.get('by_date')
    };
}

{{linkTo}}仍然不起作用,但存在细微差别。将鼠标悬停在链接上,您将不再看到基本 URL 之外的任何 URL(注意:在它之前/activities/undefined/undefined)。此外,当您单击链接时,它会将以下消息发送到浏览器的控制台:

此 linkTo 处于非活动加载状态,因为它的至少一个参数当前具有空值/未定义值,或者提供的路由名称无效。

注意:我确实将 on_date/by_date 的不一致使用更改为始终使用 by_date 命名约定。当 Ember 转换带下划线的变量并将它们转换为 camelCase 时,我有点模糊。我不认为我遇到了这个问题,但它在我的脑海中困扰着我。

4

1 回答 1

0

您应该挂钩该serialize函数并提供您的 URL 解析所需的动态段(假设user_id并且是您的模型on_date上可用的属性):Activity

App.ActivitiesByDateRoute = Ember.Route.extend({
  ...
  serialize: function(model) {
    return {
      user_id: model.get('user_id'), 
      on_date: model.get('on_date')
    };
  }
});

然后进一步假设您的linkTo助手居住activity在可用模型中,它看起来像这样:

{{#linkTo "activities.by_date" activity}}Activities{{/linkTo}}

另外值得一提的是,如果您命名您的路线on_date,您应该以相同的方式命名您的模板,反之亦然。Ember 在约定方面有很多工作,如果您不希望自己在某些时候遇到令人讨厌的错误,您应该与应用程序中的命名保持一致。

也就是说,IMO 你应该在你的路由器映射中重命名你的路由,by_date动态段也可以有不同的名称,因为你serialize稍后会在钩子中选择它。

this.resource('activities', { path: '/activities' }, function() {
  this.route('by_date', {path: '/:user/:on_date'});
});

如果你现在在哪里问“他怎么知道我的路线叫ActivitiesByDateRoute?” 我在你的另一个问题上看到了它:)

希望能帮助到你。

于 2013-08-13T21:57:28.960 回答