Ember.js: 中止后清理渴望的URL

创建于 2014-07-22  ·  28评论  ·  资料来源: emberjs/ember.js

当所有内容都设法在同一个运行循环中中止或过渡时,最好使用URL更新。 但是中止和过渡可能会在随后的运行循环中发生,在这种情况下,我们会将应用程序置于损坏状态。

在中止的情况下,您最终得到的URL不能反映您的实际当前状态。 下次用户单击“后退”按钮时,没有任何反应。

在重定向情况下,您可以通过在用户历史记录中保留中间状态来中断“后退”按钮,这通常只会再次将其重定向回去。

我与@machty讨论了这history.back()或类似的方式解除它们。

Bug Inactive Needs Submitter Response

最有用的评论

这已通过https://github.com/tildeio/router.js/pull/197 (在2.10.0-beta.3 +中)修复。

针对v2.10.0-beta.3的演示: http ://emberjs.jsbin.com/yeqisuh/1

所有28条评论

我同意这个问题。 即使我在路由的willTransition挂钩中执行了transition.abort() ,我现在也能看到它。 该URL反映了如果不中止转换将转到的页面。

:+1:

@ ef4如果您愿意的话,我很乐意为您

我可以解决这个问题,但可能不会马上解决。

:+1:遵循API文档中的willTransition示例代码时,会遇到此问题。 即使调用了abort ,URL也被更改。

我有同样的问题。 我创建了一个jsbin来为好奇重新创建它: http ://emberjs.jsbin.com/tijebi/1

@ ef4还在计划看看这个吗?

抱歉,最近我的优先列表很低。

作为记录,我遇到了同样的问题

我们摆脱了热切的URL,如果#9919

万一有人仍然有此问题并需要立即解决,请以防万一:

// app/routes/your-route.js

export default Ember.Route.extend({
    // ...
    actions: {
        willTransition(transition) {
            var model = this.controller.get('model');
            if (
                model.get('hasDirtyAttributes') && 
                !confirm("You're going to discard all unsaved changes. Are you sure?")
            ) {
                transition.abort();

                // Custom revert of Back button result
                var oldURL = this.router.generate(this.routeName, model);
                var newURL = this.router.location.getURL();
                if (oldURL != newURL) {
                    this.router.location.setURL(oldURL);
                }
            } else {
                return true;
            }
        }
    }
});

我不喜欢直接使用this.router.location方法,但是这就像现在唯一的方法(处理_所有类型的locations_)

我刚刚将我的jsbin从去年更新为1.13.4,这个问题仍然存在: http ://emberjs.jsbin.com/lohekasuhu/edit?html,css,js

我可以确认这仍然是1.13.11的问题。

afterModel的过渡中调用abort()导致URL更新,并且应用程序进入损坏状态。

随后的transitionToRoute调用无法正确更新路由,并且上述解决方法不再起作用,因为router.location没有getURLsetURL方法。

我将@bcardarella的[jsbin更新为2.5.0]。 还在发生。

这已通过https://github.com/tildeio/router.js/pull/197 (在2.10.0-beta.3 +中)修复。

针对v2.10.0-beta.3的演示: http ://emberjs.jsbin.com/yeqisuh/1

@rwjblue我不确定中止情况是否已解决。 我在ember 2.12.0中看到了这个问题。 当我过渡到在模型挂钩中中止的路由时,URL反映了应用程序的状态,就好像过渡未中止一样。 其他人是否仍在经历transition#abort这种行为?

@kanderek是的,我只是遇到了这种行为。 我在2.11.3上。

你好
在ember 2.14中,该问题似乎仍然存在

2.11.3遇到此问题

当前正在使用我在stackoverflow上发现的这个丑陋的解决方法

//right after an aborted transition
if (window.history) {
  window.history.forward();
}

请不要为此而感到羞耻^

+1

我仍然看到这个问题! 我在2.12.2

有人可以为此提供失败的例子吗?

@wagenet是使用Ember 3.1.1的示例:
https://github.com/btecu/ember-issues/tree/5210

@SirZach @adamreisnz @bcardarella @bschouwerwou @btecu @cibernox @dkorenblyum @ ef4 @kanderek @kanongil @kottenator @machty @mutewinter @pixelhandler @ rafael-paiva @rwjblue @stefanpenner @wagenet @wagenet @woprandi还是这个或对此进行新的复制,您怎么看?

@btecu您可以将您的示例更新为Ember 3.5吗?

我现在也为此+1了。 在我们的例子中,我们过渡到页面,然后使用window.history.go(-1)返回-似乎只是继续加载当前页面(完成过渡等并加载其余异步内容),这需要一段时间,然后最终向后过渡。 网址会立即更新。 可能是因为我们直接使用了历史API?

刚刚在3.9.1上经历过

因为原始错误确实已得到修复,所以这个问题很混乱。 我们不再急于更新URL。 我要结束了,因为这里有很多无关的历史。

@miguelcobain,如果可以的话,请分享您在3.9.1上的

这是我搜索此问题时仍能获得的最高结果,因此我想为所有偶然发现此问题的人粘贴一个带有解决方法的更新代码段(请让我知道是否有实际解决方案我不知道):

  <strong i="6">@service</strong> router

  <strong i="7">@action</strong> 
  willTransition(transition) {
    if (!transition.to.find(route => route.name === this.routeName) && !confirm('confirm?')) {
      transition.abort()
      let oldURL = this.router.currentURL;
      let newURL = this.router.location.getURL();
      if (oldURL != newURL) {
          this.router.location.setURL(oldURL);
      }
    }
    return true;
  }

这是@kottenator上面给出的建议的简化版本(https://github.com/emberjs/ember.js/issues/5210#issuecomment-122033542)。

此页面是否有帮助?
0 / 5 - 0 等级