2011-12-19 19 views
2

私は、内部的にURLを介して状態を管理するWebアプリケーションを構築しています。これにより、ユーザーはブラウザのボタンとサイトのUIで状態を操作できます。アプリケーションとURLの状態を管理する方法は?

URLハッシュを管理するのに私はjQuery-BBQを使用しています。また、URLが変更されたとき(ブラウザの戻る/進むボタンが押されるなど)に応じて変更するハンドラがあります。しかし、それに応じて変更された内容は、ハッシュを変更してハッシュ変更ハンドラをトリガし、ループを発生させます。

これらのシナリオを回避するには、新しい状態が以前のものと同じかどうかを確認し、そうであれば救済します。しかし、私はすぐに、各状態で動作している複数のアクタを使って、各状態を別々に扱うかなりスパゲッティなコードを手に入れています。

このような状態管理シナリオを正常に処理する設計パターンはありますか?

+0

おそらく私は私の質問では、私はURLのハッシュを使用する代わりに探していない明らかではなかった。より一般的には、変更が複数の入力(UI、ブラウザの状態/ URL)から来て、プログラムの複数の部分に影響する可能性がある状態を管理する方法を見つけようとしています。 – ericsoco

答えて

0

私がやったことは、自分のプログラム内で状態を変更できる場所を1つだけ提供し、その1つの場所ですべての状態の変更をルーティングすることが厳しくなっていることです。新しい要求された状態変化を検証する要求状態変化

  • を検証し

    1. は、現在の状態
    2. 更新とは異なっている:「1位」で

      、私は仕事が含ま公的にアクセス可能な機能の一つのグループを意味しますアプリケーションの状態

    3. 更新ブラウザ状態

    ステップ2おそらく最もIMPOですこれは、状態変更要求がアプリケーション内またはブラウザから発生しているかどうかを確認するために、アプリケーションまたはブラウザの状態を最初の変更を超えて変更する試みは何も繰り返されません。

    これまでのところ、これは状態コードの一部に状態マシンの複雑さをカプセル化しているように思えます。私はこれが何度も何度も解決されている問題だと肯定的です。

  • 1

    私は今実装する特定のデザインパターンをお勧めできませんが、html5のpushSate()とpopState()関数を見てみることをお勧めします。これらの関数は、状態だけでなく、それらの状態に結び付けられたデータを格納することができます。 github.comは、この手法を使用して、特定のパブリックリポジトリのディレクトリをトラバースしています。クイックガイドはhttps://developer.mozilla.org/en/DOM/Manipulating_the_browser_historyです。お役に立てれば。

    +0

    yep、jQuery-BBQはpush/popStateを内部的に使用し、APIはそれらの関数名を使用します。 – ericsoco

    関連する問題