我希望在更新控制器模型的属性后自动刷新页面。
我正在关注此提示: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
答案 0 :(得分:6)
我不知道为什么refresh
不会重新渲染,但为什么不亲自致电renderTemplate
?
但更基本的是,这是一种反模式。您实际上是在尝试使用自己的模板管理自己的子路由,记住您想要哪一个并在右侧调用自己渲染。但这就是Ember路由器的生活方式。只需创建多个子路由 - 一个用于crear仿真,一个用于show-simulation,让Ember完成工作。
假设你想以这种方式做事,交换模板,你的方法仍然不是很像Ember。您应该使用路线上的templateName
属性。在它上面放一个观察者来调用默认的renderTemplate
。摆脱自定义renderTemplate
答案 1 :(得分:-1)
我最终做的是像torazaburo最初说的那样,手动调用renderTemplate()
。您可以通过在控制器中的true
操作中返回sessionChanged
来实现此目的,如果您打算在那里实现它。这会将动作冒泡到您的路线。然后在您的路线中,只需实施相同的sessionChanged
操作(就像您已经做过的那样)并致电this.renderTemplate()
。
我还注意到,当用户不在指定的路线上时,动作不再会冒泡到来自控制器的路线(即使您转换到路线),因此您的路线动作赢了&#39不再被召唤。在这种情况下,显然会调用setupController()
。认为值得一提。