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

Cok*_*aka 8 ember.js

一旦控制器模型的属性更新,我想让页面自动刷新.

我正在关注这个提示:如何在Ember.js中重新加载当前路线?

所以,我的控制器中有一个动作方法"runSimulation",最后我有这一行:

this.send("sessionChanged");
Run Code Online (Sandbox Code Playgroud)

在相关的路线中,我有:

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');
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Transitioned into 'gobernadores.gobernador.simulacion'
Run Code Online (Sandbox Code Playgroud)

(预计).我想转换到"gobernadores.gobernador.simulacion"将导致调用renderTemplate(由于某种原因,这里没有发生).

什么可能给我们一个线索可能是"执行"刷新返回的"过渡"对象的值.在我的情况下,它给出:

{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"}
Run Code Online (Sandbox Code Playgroud)

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

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

刷新此路径和任何子路径上的模型,以类似于从其他路径转换时输入路径的方式触发beforeModel,model和afterModel挂钩.当前路由参数(例如article_id)将被传递到相应的模型钩子,如果返回不同的模型,setupController和相关的路径钩子也将重新激活.

所以...也许我的问题归结为......:路由的刷新方法应该满足哪些条件才能返回isActive为true的转换?

我正在使用ember 1.10.0

谢谢,拉卡

UPDATE

我把这个链接放在这里...,以防它在分析情况时提供一些帮助:http://blog.trackets.com/2013/02/08/router-request-lifecycle.html

小智 6

我不知道为什么refresh不重新渲染,但你为什么不给renderTemplate自己打电话?

但更基本的是,这是一种反模式.您实际上是在尝试使用自己的模板管理自己的子路由,记住您想要哪一个并在右侧调用自己渲染.但这就是Ember路由器的生活方式.只需创建多个子路由 - 一个用于crear仿真,一个用于show-simulation,让Ember完成工作.

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