我有一个Emberjs应用程序,其搜索操作需要在所有路径中提供。为此,我在应用程序路径中定义了“搜索”操作,如下所示:
App.ApplicationRoute = Ember.Route.extend({
actions: {
search: function (query) {
this.transitionTo('search', { queryParams: { q: query } });
}
}
});
'q'查询字符串参数在SearchController中定义:
App.SearchController = Ember.ArrayController.extend({
queryParams: ['q'],
q: ''
});
搜索路由调用使用查询参数查询我的数据库的服务,如下所示:
App.SearchRoute = Ember.Route.extend({
model: function (params) {
return this.store.find('activity', { query: params.q }),
}
});
我知道没有在transtionTo上调用模型钩子,但是当用户已经在搜索页面上并且想要使用不同的查询再次搜索时,我需要使用新模型重新加载搜索路径。
在这种情况下,在应用程序路由中使用transitionTo是错误的方法吗?
非常感谢任何想法!
答案 0 :(得分:1)
我会在您的应用模板中添加一个名为 {{outlet}} 的地方,无论您希望在何处显示搜索结果。然后,在您的应用程序路由中,在 renderTemplate 挂钩内,我将搜索结果模板呈现到新的插座中,同时指定 controller 它应该使用。
在控制器上,您可以创建计算属性,它将检测查询字符串中的更改(或者您想要提供搜索结果)。然后,此属性(或多个属性)将提供搜索结果模板中的数据。
有关在路线中渲染模板的更多信息:
http://emberjs.com/guides/routing/rendering-a-template/
如果您决定将 renderTemplate 挂钩放在 Application 路由中,则可以设置 Search 控制器的模型(或者你想要称之为的任何路线的属性,需要在搜索控制器上更新模型才能显示正确的结果:
this.controllerFor('search').set('model', model);
您还可以创建一个 Mixin ,其中包含 renderTemplate 挂钩,您可以将其包含在您想要进行搜索的任何路线中。在钩子中,您可以将路线的模型发送到控制器:
renderTemplate: function(controller, model) {
this.render('search', {
into: 'search',
outlet: 'application',
controller: 'search',
model: model
});
}
使用其中一些技巧。我确定我错过了一些细节,但我认为你可以让他们工作。