Ember 路由中的查询参数 VS 控制器中的查询参数

Ember queryParams in Route VS in Controller

我对 Ember 文档中的 queryParams 感到困惑。说明可以把queryParams放到Controller或者Route中。 Route 与 Controller 中的 queryParams 除了语法之外有什么区别?

据我了解,在 Route 中将 queryParams 作为对象允许我执行以下操作:

  1. 使用 replace: true 和 refreshModel 选项。
  2. 捕获查询参数比控制器更快。
  3. 模型钩子可以接收参数值

什么情况下你会选择在Controller中使用queryParams?

您可以使用控制器设置 queryParams 的默认值,将 queryParam 值绑定到模板中的值,以及更新 queryParam 值。当这些值在控制器中发生变化时,控制器会更新 url,并且路由采用 url 值,以便您可以进行 ember 数据请求。

假设您正在呈现一个分页的项目列表,页面上有分页控件。在初始页面加载时,您从 API 加载第一页结果。为了link上那个'next page'动作加载下一组结果,需要使用controller来更新queryParams。

您的路线可能如下所示:

 export default Route.extend({
  queryParams: {
    pageNumber: {
      refreshModel: true //when we set this to true, every time the pageNumber param changes, the model hook below will refresh and the data set will update.
    }
  },

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

 });

您的控制器可能如下所示:

export default Controller.extend({
  queryParams: ['pageNumber'],
  pageNumber: 1,

  actions: {
    nextPage () {
      const newPageNumber = this.get('pageNumber') + 1;
      this.set('pageNumber', newPageNumber);
    }
  }
});

当您更新控制器中的 pageNumber 属性时,这将绑定到路由并刷新模型,加载下一页数据。

如果您需要修改模板中的任何 queryParams,基本上控制器就在那里。您可能有一个可以过滤、分页、更新等的数据列表,您可以使用控制器控制这些参数。

您还可以在控制器中为参数设置默认值。

希望对您有所帮助! (: