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

时间:2015-02-14 08:39:01

标签: ember.js

我希望在更新控制器模型的属性后自动刷新页面。

我正在关注此提示: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”对象的值。在我的情况下,它给出了:

{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文档......

  

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

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

我正在使用ember 1.10.0

谢谢, 拉嘎

更新

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

2 个答案:

答案 0 :(得分:6)

我不知道为什么refresh不会重新渲染,但为什么不亲自致电renderTemplate

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

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

答案 1 :(得分:-1)

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

我还注意到,当用户不在指定的路线上时,动作不再会冒泡到来自控制器的路线(即使您转换到路线),因此您的路线动作赢了&#39不再被召唤。在这种情况下,显然会调用setupController()。认为值得一提。