route.afterModel 钩子没有被击中

route.afterModel hook not being hit

当您尝试从父路由转换到同一路由时,未命中 afterModel 挂钩。

我希望 afterModel 挂钩始终触发。

Twiddle

编辑: 这有点难以理解,除非你可以看一下 twiddle,但这是代码

// Controller/application.js
export default Ember.Controller.extend({
  appName: 'Ember Twiddle',
  actions: {
    goTo() {
        this.transitionToRoute('food');
    }
  }
});

// templates/application.hbs
<button onclick={{action 'goTo'}}>Food Options</button>
<br>
{{outlet}}

//router.js
const Router = Ember.Router.extend({
  location: 'none',
  rootURL: config.rootURL
});

Router.map(function() {
  this.route('food', function() {
    this.route('options');
    this.route('fruits');
    this.route('veggies');
  });
});

//routes/food.js
export default Ember.Route.extend({
  model() {},
  afterModel() {
    this.transitionTo('food.options');
  }
});

第一次点击食物选项按钮正确调用食物路线中的afterModel。第二次点击不点击afterModel

参考 AlexSpeller Diagonal 以查看给定 ember 路由定义的路由结构、模板和路由挂钩。它是路线结构的绝佳图形表示。

问题:

I am in a sub route under food, say food/fruits. If I click the button again I expect to be taken to the food route and then redirected to options

答案:food路由没有URL,因为它是父路由。您将始终处于此路由的子状态(例如 food.index)。因此,当您说 transitionTo('food') 时,这意味着您正在过渡到 food.index 路线。

URL /food/fruits - 将执行 food 模型挂钩和 fruits 模型挂钩。
URL /food - 将执行 food/index 模型挂钩,不会执行 food 模型挂钩。

所以在你的情况下,你可以从 food afterModel 钩子中删除 this.transitionTo('food.options') 并且你可以引入 food.index 有食物选择的路线。

查看包含索引路由的修改后的 ember twiddle