查询参数移除和refreshModel

Query parameters removal and refreshModel

所以我的这个应用程序有一个页面,其中包含一个可以过滤的列表。

列表背后的数据可能非常大,因此过滤是通过发送过滤器参数在服务器端完成的,与 JSONAPI 参考中的内容非常相似(例如 ?filter[name]=John&filter[date]=2016-09-12|2016-09-15).

为了做到这一点,我设置了如下路线:

export default Ember.Route.extend(AuthenticatedRoute, {
  queryParams: {
    'filter[name]': {
      refreshModel: true
    },
    [...]
  },

  model(params) {
    return this.store.query('receipt', params);
  }
});

这使得路由将其查询参数毫无问题地复制到 API 调用。

现在,当然,用户必须能够从他的界面更改过滤器,对吧?所以我做了一点 Bootstrap modal/form 并将它与我的控制器中的一个动作连接起来,它构建了一组查询参数并使用它们重新加载路由:

changeFilters() {
  var params = {};
  if (this.get('nameFilter')) {
    params['filter[name]'] = this.get('nameFilter');
  }
  [...]
  this.transitionToRoute({queryParams: params});
}

这样做确实效果很好。当在查询中添加或更改 filter[name] 参数时,路由会刷新并更新模型。但是,当用户禁用过滤器时,问题就来了:即使 refreshModel 设置为 true,删除查询参数似乎也不会刷新路由。

所以,我很确定这是一个错误,因为它对我来说没有任何意义,但与此同时我对 Ember 还很陌生,所以我想我会在这里寻求帮助在提交错误报告之前。

所以我缺少什么吗?或者这是 design/some 种设计限制?

谢谢!

如果不使用 transitionToRoute,而是通过控制器上的绑定更新查询参数,会怎样?

代码如下所示:

export default Ember.Controller.extend({

  queryParams: {
    'filter[name]': {
      refreshModel: true
    },
  },

});

changeFilters() {
  var params = {};
  if (this.get('nameFilter')) {
    this.set('filter[name]', this.get('nameFilter'));
  }
  [...]
}

我不确定这是否有效,但你可以试一试。