読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

Iron Routerとappcache

Meteor/Iron Router1.0以前ではappcacheと組み合わせると、パラメータを含むURLもアクセス履歴に応じてアプリケーションキャッシュに保存されてしまうという不具合がありました。
1.0になった時これを回避するために、パスのハッシュ化が取り入れられました。appcacheを使う場合、Iron Routerのdomain.com/pathameはすべてdomain.com/#/pathnameにリダイレクトされます。
本来のハッシュは、クエリパラメータに移されます。

domain.com/pathname#hash

domain.com/#/pathname?__hash__=hash

Iron Router内ではうまく処理されて、ハッシュはappcacheを使わない場合同様、this.params.hashに格納されます。

この変更で2点困ることがあって、1点はlocationオブジェクトが非互換になること。これについては、locationの代わりにIron.Location.get()を使うことで回避できます。

もう1点困ることは、RatchetなどモーダルにaタグでnameをつけてJavaScriptでエフェクトを入れているフレームワークを使うと誤動作してしまうことです。

Ratchetの場合、aタグをクリックするとモーダルのclassにactiveを加えるか削除するかなので、aタグのクリックハンドラにevent.preventDefault()を入れて、ネームハッシュに飛ばないようにすることで動きました。

BootstrapのModalは元々、event.preventDefault()してトグルする実装なので問題なく動きました。