YUIのDataTableとキャッシュ(Cache)コントロール

これまでのしばらく、『YUI2.7.0のDataTable(特に、Editable Table:編集可能な表)の実用』を想定したコードを書いてきた。それらのログの中で、「(更新・削除されたデータが)表の中に一時的に保管される」と書いた。これは、「ページをリフレッシュすると、せっかく変更したデータをロストしてしまう」可能性があるということである。

また、この逆の課題として、表を編集してサーバーに送ったら、『画面を(新しいデータで)リフレッシュしたい』という要求がでてくる。たとえば、データを表中から削除した(&サーバーに送信した)場合、画面をリフレッシュしても、ブラウザーがキャッシュを食ってしまうと、画面上には『消したはずの行』が現れてしまう。このとき、サーバー上のデータは消えているのだから、存在しないデータが表示される、という不具合が起きてしまう。

これを防ぐには、データ送信後に、ブラウザー・キャッシュを食わないように画面をリフレッシュする(再構築する)、という課題が持ち上がる。
YUI2.7.0のDataTableのAPIを見ると、initializeTable()であるとか、destroy()だとか、DataTableを再構築するためのそれらしいメソッドが用意されているのだが、実験してみたところ、どうもうまく作れない。

そして、結局、この課題は(よくある)「キャッシュを無効にする」という些か面倒な問題にいきついてしまった。

ブラウザーにキャッシュさせないためには、head内に

<head>
        ...
	<meta http-equiv="Pragma" content="no-cache">
	<meta http-equiv="Cache-Control" content="no-cache">
	<meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT">
        ...
</head>

と書く方法がよく知られるが、うまくいかないようである(テストはFireFox3.0、IE7、Chrome1で行った)。IE7では、「インターネットオプション」->「全般」タブ -> 「閲覧履歴の設定」 -> 「保存しているページの新しいバージョンの確認」を、「Webサイトを表示するたびに確認する」に変更すると、(DataTableの再構築が)そこそこうまく行くようだが、(クライアントの設定を強要するという意味で)これもあまりうまい方法ではない。

結局、安定してDataTableの再構築ができるのは、Apacheの設定(httpd.conf)を以下のように変更)した場合だった(テスト環境は、WindowsXPにインストールしたApache2.2.9)。

# headerモジュールをロードする
LoadModule headers_module modules/mod_headers.so

# サイトのルート定義に以下を追加する。(サイト全体にこの設定をかけたくない場合は、細かく設定する)
        Header set Pragma no-cache
	Header set Cache-Control no-cache
	Header set Expires "Thu, 01 Dec 1994 16:00:00 GMT"

サーバー側でのこの設定も、利用環境によって

  • httpd.confを変更できない可能性がある。(Apache2.2では、ヘッダーモジュールはオプションになっている)
  • Httpサーバーとクライアントの間にプロキシサーバーがある場合、プロキシのキャッシュを(ブラウザーが)食ってしまう。

という可能性があって完全ではない。

1つだけ言えるのは、YUIのデータテーブルで行を削除する、という仕様は(このようにキャッシュの影響をモロに受けてしまうので)、うまくないこと。
データを削除するための妥当な仕様を作るには、適度に「同期処理(MVC2パターン)」を混ぜて、『自然なDataTableの再構築』をするのがよいような気がする。