2

在把手模板中使用 linkTo 助手时,Ember 在我添加到路由中的序列化程序的帮助下为链接设置了正确的 URL:

serialize: function(slug, params) {
    var name, object;
    object = {};
    name = params[0];
    object[name] = slug;
    return object;
}

当我点击链接时,Ember 会跳转到正确的页面,其中包含正确的 slug 和所有内容,但它没有正确的数据,它会这么说。我相信这是因为我作为第二个参数传递给我的 linkTo 语句的只是 slug 而不是整个模型。

如果我只是在地址栏中键入 URL 而不是依赖传递给 linkTo 语句的模型(不是),是否可以让 Ember 简单地获取数据?

更新 我已经在我的路线上的激活方法中尝试过这个,但现在看来问题是渲染必须等到完成。

activate: function() {
    this.context.isLoaded = false;
    this.model(this.context.query.slug);
}

有任何想法吗?也许甚至有一个更漂亮的解决方案?

4

2 回答 2

4

在 IRC 上的一些人的帮助下,我最后想出的解决方案是使用 setupController 钩子,就像你提到的,Darshan 和这样的序列化器:

CustomRoute = Ember.Route.extend({
    setupController: function(controller, model) {
        var modelName = this.routeName.substr(0, 1).toUpperCase() + this.routeName.substr(1),
            slug = model;
        if (model.hasOwnProperty('slug'))
            slug = model.slug;
        controller.set('model', App[modelName].find({'slug': slug}));
    },
    serialize: function(slug, params) {
        var name, object;
        object = {};
        name = params[0];
        object[name] = slug;
        return object;
    }
});

这样,您可以仅将路由的 slug 作为第二个参数提供给 linkTo 助手而不是模型,并且序列化程序将正确设置 URL,然后 setupController 将检查模型是否具有属性slug,这正确意味着它是一个正确的模型,如果不是,它只是猜测模型只是 slug,然后它将使用 DS.Model.find 方法向控制器模型存储返回一个承诺。

因为 setupController 在每次进入路由时都会被调用,而模型钩子只是有时会被调用,因此 DS.Model.find 方法每次都会被用来通过 promise 获取数据,瞧——每次进​​入路由时都会获取数据.

这假设您使用 Ember.Data 并且您的模型对象称为 App.*route name* 以大写字母开头,但可以轻松修改它以适应可能有的任何需要。

对于我的应用程序中的所有路由,我现在从该路由子类化(扩展),从而为我的所有路由获得我想要的行为。

于 2013-06-29T12:17:23.383 回答
0

您可以尝试在 Route 中使用 slug 名称,然后使用findQuery而不是为Route 加载数据find

App.Router.map(function() {
  this.resource('product', { path: '/product/:slug' });
});

App.ProductRoute = Ember.Route.extend({
  model: function(params) {
    return App.Product.query({name:params.slug});
  }
});
于 2013-06-27T12:28:38.277 回答