什么是“强迫”模型钩子射击的最佳方法是什么?

时间:2013-12-01 20:37:42

标签: ember.js

我正在使用ember.js 1.2,其中一条路线有一个非常动态的模型。当我第一次跳到路线或者当我粘贴路线的模型钩子的URL时,然后设置控制器触发,一切都按预期工作。

当我稍后进入路径(但不是直接来自url)时会出现问题 - 这只会触及setupController挂钩(并且模型方法永远不会触发)。但从技术上讲,改变的是url(和父模型)。使用此模型,它主要是从父模型定义的(使用该父模型在运行时获取一组新的动态配置)。

那么每次加载这条特定的路由时,如何强制setupController重新执行模型钩子? (好像模型方法每次都在开火)。

或者......我应该在setupController中获取这个动态模型,并通过让它返回一个空对象来保持模型钩子无逻辑吗?

更新

App.ChildIndexRoute = Ember.Route.extend(App.ModelMixin, {
  setupController: function(controller, model) {
    this._super(controller, model);
    var parent = this.modelFor('parent');
    return this.getForParent(parent).then(function(things) {
      controller.set('model', things);
    });
  }
});

1 个答案:

答案 0 :(得分:6)

您可以使用setupController hook代替模型钩子,这是一种完全可以接受的方式来处理它。

从技术上讲,转换是调用模型钩子并将其提供给setupController。

链条中的哪个位置没有触发模型钩子?这是一个带有一些嵌套资源的简单应用程序。

http://emberjs.jsbin.com/AtebAsOS/6/edit

此示例中的代码的关键位于DogsRoute:

App.DogsRoute = Em.Route.extend({
  setupController: function(controller, model){
    model = Em.get(this.modelFor('cow'), 'dogs');
     this._super(controller, model); 
  }
});

来自文档:

  

使用当前路由的控制器和setupController挂钩提供的模型调用[{1}}]方法。

因此,当您使用获取的狗模型覆盖模型并将其传递给model时,控制器将使用刚刚获取的模型。