【问题标题】:Ember calling refresh on route does not cause the renderTemplate to be invokedEmber 在路由上调用刷新不会导致调用 renderTemplate
【发布时间】:2015-04-15 08:08:33
【问题描述】:

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

我正在关注这个提示: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”事件被路由对象中的处理程序成功捕获)...,但我没有看到 DINDONG 被打印。

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

Transitioned into 'gobernadores.gobernador.simulacion'

(这是预期的)。我想转换到“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"}

这个“isActive”是假的。这可能是原因吗?如果是,为什么“isActive”是假的?

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

刷新此路由和任何子路由上的模型,触发 beforeModel、model 和 afterModel 钩子,其方式与从其他路由过渡时进入路由的方式类似。当前的路由参数(例如article_id)将被传递到各自的模型钩子中,如果返回不同的模型,setupController 和相关的路由钩子也会重新触发。

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

我使用的是 ember 1.10.0

谢谢, 拉卡

更新

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

【问题讨论】:

  • 我看到了完全相同的问题。我有一条没有模型的路线,我想刷新页面,导致调用 renderTemplate()。不幸的是,如果我使用 this.refresh(),它不会做任何事情。为了触发对 renderTemplate() 的调用,需要做什么?

标签: ember.js


【解决方案1】:

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

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

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

【讨论】:

  • 我理解你关于这是一个反模式的观点。但是在某些用例中您不想为此使用路由是有原因的。就我而言,我有 3 个单独的模板要在索引路由中呈现,具体取决于用户身份验证状态。所以显然我不想要索引或索引/登录或其他任何东西。所以这就是为什么我需要在同一条路线上显示不同的模板。这就是为什么我需要刷新路由的状态才能重新渲染模板。或者就像我最初所说的那样,让它再次调用 renderTemplate,切换模板所在的位置
  • 我手动尝试了 renderTemplate;但由于我需要从应用程序路由执行此操作,因此它不适用于来自其他路由的调用。另外,即使触发器来自索引,除了实际渲染之外,我仍然需要做一些初始化......所以这不起作用。我有点厌倦了所有这些“它不像 Ember”或“是的,嗯,Ember 不能那样工作”......这不是你的错,不要误会我的意思。只是框架太有限了。我负责 Android、Server 和 Web,只有 Ember 会造成麻烦……这难道不是证明一点吗?
  • 关于 templateName 属性,我不熟悉。我想您会将属性设置为“index”或“index-signed-in”,它只会自动触发 renderTemplate 并呈现上述模板?
  • 没关系,通过在控制器和路由之间进行多次跳跃并最终每次手动调用 renderTemplate() 使其工作。不太好,但是在 Ember 中又有什么好...?
  • 我认为 torazaburo 的方法在这种情况下是最干净的。
【解决方案2】:

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

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

【讨论】:

  • 您的编辑被拒绝,因为它改变了其他用户的答案。对他们的答案发表评论是绝对正确的,或者像您所做的那样,如果它为表格带来了足够的新信息,则添加一个新答案。
  • 编辑的重点是完成他的答案,而不是创建一个实际上基于另一个答案的全新答案。这没有意义。也支持他按照赏金的回答。但是,嘿,不管你的船是什么,对吧?此外,如果一个人拒绝编辑,常识会告诉一个人也提供一个解释为什么会发生这种情况。但是不,拒绝并继续你的一天更容易。
  • @Andrew“编辑的重点是完成他的答案” - 通常这是通过评论答案来完成的,要求发布者完成它。
猜你喜欢
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2016-08-28
  • 2017-04-03
  • 2019-10-15
相关资源
最近更新 更多