从 Promise 处理程序调用 Ember _super 方法
Posted
技术标签:
【中文标题】从 Promise 处理程序调用 Ember _super 方法【英文标题】:Calling an Ember _super method from Promise handler 【发布时间】:2014-11-12 04:39:43 【问题描述】:我正在尝试在控制器操作中的 Promise 处理程序中使用 _super,但它不起作用,因为它似乎丢失了正确的函数链。
ApplicationRoute = Ember.Route.extend SimpleAuth.ApplicationRouteMixin,
actions:
sessionAuthenticationSucceeded: ->
@get("session.user").then (user) =>
if @get("session.isTemporaryPassword") or not user.get "lastLogin"
@transitionTo "temp-password"
else
@_super()
我想在 else
上恢复为 Mixin 的默认行为,但我需要先异步解析 user
,然后才能执行条件语句。我试过了:
ApplicationRoute = Ember.Route.extend SimpleAuth.ApplicationRouteMixin,
actions:
sessionAuthenticationSucceeded: ->
_super = @_super
@get("session.user").then (user) =>
if @get("session.isTemporaryPassword") or not user.get "lastLogin"
@transitionTo "temp-password"
else
_super()
和
ApplicationRoute = Ember.Route.extend SimpleAuth.ApplicationRouteMixin,
actions:
sessionAuthenticationSucceeded: ->
@get("session.user").then (user) =>
if @get("session.isTemporaryPassword") or not user.get "lastLogin"
@transitionTo "temp-password"
else
@_super.bind(@)()
都不行。
This answer 声称这应该从 1.5.0 开始工作,但我使用的是 1.7.0-beta.5 并且不行。有没有办法让它发挥作用,即使是在不同的处理方式方面?
【问题讨论】:
【参考方案1】:Ember 目前不支持异步调用 _super
。在那个例子中,我实际上并没有异步调用_super
,它仍然是同步的。
http://emberjs.com/blog/2014/03/30/ember-1-5-0-and-ember-1-6-beta-released.html#toc_ever-present-_super-breaking-bugfix
【讨论】:
【参考方案2】:为了继续冒泡,您需要使用操作名称调用this.target.send()
。
见:How can I bubble up an Ember action inside a callback function?
这样的事情应该可以工作:
ApplicationRoute = Ember.Route.extend SimpleAuth.ApplicationRouteMixin,
actions:
sessionAuthenticationSucceeded: ->
@get("session.user").then (user) =>
if @get("session.isTemporaryPassword") or not user.get "lastLogin"
@transitionTo "temp-password"
else
@target.send('sessionAuthenticationSucceeded')
【讨论】:
嗯,这对我想要完成的工作有用吗?我想让默认行为(在 Mixin 代码中找到)在else
上运行,而不是将操作冒泡到链中的不同类。以上是关于从 Promise 处理程序调用 Ember _super 方法的主要内容,如果未能解决你的问题,请参考以下文章
Ember.js:从嵌套路由调用 ApplicationRoute 的操作
Ember:在router.willTransition钩子中等待promise