如何使用全局查询参数

时间:2014-04-14 08:49:50

标签: ember.js

我有一些查询参数,当我从一条路线切换到另一条路线时,我不想放松。从文档中,解决方案似乎是使用全局查询参数,在ApplicationController上设置。

我们说我的设置是:

  • 显示对象列表的页面,左侧有一些标准用于过滤此列表。我们可以调用相关的控制器ListController。所有标准都必须是查询参数。
  • 单击第一页中的对​​象时,整个页面将替换为该对象的详细视图。从这个页面我需要能够回到我以前过滤的列表,从而保持我的查询参数。

我需要从ApplicationController访问ListController个全局查询参数进行一些操作。这很简单:

App.ListController = App.ArrayController.extend({
   needs: "application",
   qp: Ember.computed.alias("controllers.application"),
   ....

当条件更改时,过滤操作在服务器端完成,因此我需要在查询参数更改时刷新ListRoute

如何从ApplicationRoute完成此操作?

App.ApplicationRoute = Ember.Route.extend({
   actions: {
      queryParamsDidChange: function () {
         var listRoute = ??????;
         listRoute.refresh();
      }
   }
}

您如何看待整个设置?我走在一条好路上吗?我不确定......

1 个答案:

答案 0 :(得分:0)

这就是我所做的。

queryParams在路由中定义。这将是“父母”,对其子女有影响。

queryParams:
  fooParam: 
    refreshModel: true

设置refreshModel:true将触发路由的beforeModel:model:afterModel:挂钩以及所有后代路由。目前,没有办法为后代单独打开或关闭此行为。

及其控制器

queryParams: ['fooParam']
fooParam: null

控制器中的queryParams挂钩不会覆盖路由中的queryParams挂钩,而是整个功能工作的必要和补充。您不应将任何这些属于控制器中的任何属于路由,或属于控制器中的路由。

所有查询参数键也需要在控制器中定义。此挂钩的值只是默认值。它仍将根据查询参数进行更改。

然后,任何后代路线,

model: ->
  this.modelFor('parent').filterBy('childAttribute', this.paramsFor('parent').fooParam)

或者如果你想要一个(默认情况下是第一个)记录:

model: ->
  this.modelFor('parent').findBy('childAttribute', this.paramsFor('parent').fooParam)