Emberjs - 需要在transtion上刷新模型

时间:2015-02-18 21:54:18

标签: ember.js

我有一个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是错误的方法吗?

非常感谢任何想法!

1 个答案:

答案 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
  });
}

使用其中一些技巧。我确定我错过了一些细节,但我认为你可以让他们工作。