Ember(数据)linkTo没有传递模型,只需获取新模型

时间:2013-06-27 09:46:58

标签: ember.js ember-data

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

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

当我点击链接时,Ember会使用正确的slug和所有内容转换到正确的页面,但它没有正确的数据,并且它说明了这一点。我相信这是因为我传递给我的linkTo语句作为第二个参数只是slug而不是整个模型。

是否可以让Ember简单地获取数据,就像我只是将URL输入地址栏而不是依赖于传递给linkTo语句的模型(不是)一样?​​

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

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

有什么想法吗?甚至可能有一个更漂亮的解决方案?

2 个答案:

答案 0 :(得分: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方法返回一个promise到控制器模型商店。

因为每次进入路径时都会调用setupController,因为有时只调用模型钩子,每次都会使用DS.Model.find方法通过promise获取数据,并且每次使用时都会获取数据进入一条路线。

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

对于我的应用程序中的所有路径,我现在从这条路线继承(扩展),从而获得我所有路线所需的行为。

答案 1 :(得分:0)

您可以尝试使用路径中的段名称,然后使用findQuery而不是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});
  }
});
相关问题