在 Handlebars 模板中使用 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);
}
有什么想法吗?也许甚至有一个更漂亮的解决方案?
最佳答案
在 IRC 上一些人的帮助下,我最后想出的解决方案是使用 setupController 钩子(Hook),就像你提到的 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 到 Controller 模型商店。
因为每次输入路由时都会调用 setupController,而模型钩子(Hook)仅有时被调用,因此每次都会使用 DS.Model.find 方法通过 Promise 获取数据,瞧 - 每次都获取数据输入路线。
这假设您使用 Ember.Data 并且您的模型对象名为 App.*route name* 以大写字母开头,但可以轻松对其进行修改以满足任何需要。
对于我的应用程序中的所有路线,我现在从此路线进行子类化(扩展),从而为所有路线获得我想要的行为。
关于ember.js - Ember (data) linkTo 不传递模型,只需获取新模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17339890/