Ember 在路由上调用刷新不会导致调用 renderTemplate

Ember calling refresh on route does not cause the renderTemplate to be invoked

我想让页面在 属性 控制器模型更新后自动刷新。

我正在关注这个提示:How to reload current route in Ember.js?

所以,我的控制器中有一个操作方法 "runSimulation",在它的末尾我有这一行:

this.send("sessionChanged");

在关联的路线中,我有:

actions: {
  sessionChanged: function() {
    console.log('YEAH');
    var transition = this.refresh();
    console.log(transition);
  }
},

renderTemplate: function(controller, model) {
  console.log('DINGDONG');
  var model = this.currentModel;
  if (model.simulation.params == undefined) {
    this.render('gobernador/crear-simulacion');
  } else {
    this.render('gobernador/show-simulacion');
  }
}

我可以看到 YEAH 被打印出来(意思是:控制器发送的 "sessionChanged" 事件被路由对象中的处理程序成功捕获)...,但我没有看到 DINGDONG 被打印出来。

我正在使用 ember-cli,并且启用了日志转换。我可以在我的 javascript 控制台中看到这个:

Transitioned into 'gobernadores.gobernador.simulacion'

(这是预期的)。我想过渡到 "gobernadores.gobernador.simulacion" 会导致调用 renderTemplate(由于某种原因这里没有发生)。

这里可能给我们提供线索的可能是 "transition" 对象 return 从执行 "refresh" 得到的值。在我的例子中,它给出了:

{state: TransitionState, intent: C, **isActive: false,** router: Router, data: Object, resolvedModels: Object…} _visibleQueryParams: Objectdata: Object, handlerInfos: Array[4], intent: C, params: Object, pivotHandler: Class, promise: PromisequeryParams: Object, resolveIndex: 4,resolvedModels: Objectrouter: Routersequence: 4, state: TransitionStatetar, getName: "gobernador.simulacion"}

这个"isActive"是错误的。这可能是原因吗?如果是,为什么 "isActive" 是假的?

我检查了 Ember.Route::refresh ( http://emberjs.com/api/classes/Ember.Route.html#method_refresh ) 的 API 文档 ...

Refresh the model on this route and any child routes, firing the beforeModel, model, and afterModel hooks in a similar fashion to how routes are entered when transitioning in from other route. The current route params (e.g. article_id) will be passed in to the respective model hooks, and if a different model is returned, setupController and associated route hooks will re-fire as well.

所以...也许我的问题归结为...:路由的刷新方法应该满足什么条件 return 一个 isActive 为 true 的转换?

我正在使用 ember 1.10.0

谢谢, 拉卡

更新

我把这个 link 放在这里...,以防它对分析情况有所帮助:http://blog.trackets.com/2013/02/08/router-request-lifecycle.html

我不知道为什么 refresh 不重新渲染,但你为什么不自己调用 renderTemplate

但更重要的是,这是一种反模式。您实际上是在尝试管理自己的子路径,每个子路径都有自己的模板,方法是记住您想要的子路径并在正确的子路径上调用 render 自己。但这就是 Ember 路由器的谋生手段。只需创建多个子路径——一个用于 crear-simulation,一个用于 show-simulation,然后让 Ember 完成工作。

假设您想以这种方式做事,交换模板进出,您的方法仍然不是很 Ember。您应该在路线上使用 templateName 属性。在它上面放一个观察者,当它发生变化时调用默认的renderTemplate。摆脱你的习惯 renderTemplate

我最后做的是,就像torazaburo最初说的那样,手动调用renderTemplate()。如果您打算在那里实现它,您可以通过在控制器的 sessionChanged 操作中返回 true 来实现。这会将操作冒泡到您的路线。然后在你的路线中,只需实施相同的 sessionChanged 操作(就像你已经做过的那样)并调用 this.renderTemplate().

我还注意到,当用户不在指定路线上时,动作将不再从控制器冒泡到路线(即使您转换到它),因此您的路线动作不会不再被调用。在这种情况下,显然 setupController() 被调用。觉得值得一提。