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気になる方は、試してみてください。 lemmeはあなたの興味/可用性を知っています

私はこれに取り組むことができますが、おそらくすぐにはできません。

:+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メソッドを直接使用するのは好きではありませんが、現時点でこれを行う唯一の方法のようです(_すべてのタイプの場所_を処理するため)

jsbinを昨年から1.13.4に更新しましたが、この問題はまだ存在します: http ://emberjs.jsbin.com/lohekasuhu/edit?html、css、js

これは1.13.11でもまだ問題であることが確認できます。

呼び出しabort()遷移にafterModel URLで結果が更新され、アプリケーションが壊れた状態になって。

後続のtransitionToRoute呼び出しはルートを正しく更新できず、 router.locationgetURL setURLメソッドと

@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これが中止の場合に修正されるかどうかはまだtransition#abortこの動作を経験していますか?

@kanderekはい、私はちょうどこの振る舞いに出くわしました。 私は2.11.3を使用しています。

こんにちは、
残り火2.14で、問題はまだ存在しているようです

2.11.3でこの問題を経験する

現在、stackoverflowで見つけたこの醜い回避策を使用しています

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

そのことで私を恥じないでください^

+1

私はまだこの問題を見ています! 私は2.12.2を使用しています

誰かがこれの失敗例を提供できますか?

@SirZach @adamreisnz @bcardarella @bschouwerwou @btecu @cibernox @dkorenblyum @ EF4 @kanderek @kanongil @kottenator @machty @mutewinter @pixelhandler @ラファエル・パイヴァ@rwjblue @stefanpenner @wagenet @woprandiこれは、おそらく、我々は閉じる必要があり、まだ問題ですまたはこれの新しい複製を作成します、あなたはどう思いますか?

@btecu例を

+1今もこれにぶつかっています(私は思います)。 私たちの場合、ページに移行してから、window.history.go(-1)を使用して戻ります-現在のページの読み込み(移行の完了と残りの非同期コンテンツの読み込み)を続行しているようですが、しばらく時間がかかり、最終的には遷移を元に戻します。 ただし、URLはすぐに更新されます。 おそらく、履歴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 評価