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()
被调用。觉得值得一提。
我想让页面在 属性 控制器模型更新后自动刷新。
我正在关注这个提示: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()
被调用。觉得值得一提。