如果查询参数发生更改,我已经在路由中设置了queryParam设置以刷新模型。但是,当查询参数更改时,不会调用setupController。知道为什么会这样吗?

export default Route.extend({
  queryParams: {
    id: {
      refreshModel: true
    }
  },

  setupController(controller) {
    controller.start(); // fetches data synchronously from api
  }
});

//解决方案感谢alptugd的回复
export default Route.extend({
  queryParams: {
    id: {
      refreshModel: true
    }
  },

  model() {
    // Returning a new array/object/value everytime the hook is called, causes the
    // setupController hook to be called.
    return [];
  }

  setupController(controller) {
    controller.start(); // fetches data synchronously from api
  }
});

最佳答案

refreshModel强制路由到refresh,并且如预期的那样,您应该期望beforeModelmodelafterModelsetupController挂钩运行。然而; setupController钩子(Hook)有一点区别:

看看source coderelevant API documentation中Ember的refreshroute.js方法的注释。都说:

“刷新此路径和任何子路径上的模型,以类似于从其他路径转换时输入路径的方式触发beforeModelmodelafterModel钩子(Hook)。当前路径参数(例如article_id)将传递到相应的模型挂钩,如果返回了不同的模型,则setupController和关联的路线挂钩也会重新触发。”

这意味着;为了在发生setupController时触发refreshmodel挂钩应返回其他模型。就你而言您没有任何模型hook;因此setupController参数值更改后将不会调用id

顺便说说;如果覆盖setupController钩子(Hook),则最好调用super方法,因为它的唯一目的是将model属性保存到controller。查看API,以获取有关此情况的详细说明。

10-04 21:51