これは一般的な問題であり、UIの複雑さが増すにつれて明らかになり、サーバーとクライアントの両方のテンプレートで変更を行う必要があります。この問題は、クライアント側とサーバー側の両方で同じテンプレートマークアップを使用することで修正できます。テンプレートプロセッサは、JavaScriptとサーバー側言語の両方で作成する必要があります。
上記のアプローチよりもクリーンであるが、どちらにも独自の問題がある他の2つのソリューション:
- クライアント側ですべてを行う
- サーバー側ですべてを行う
すべてのマークアップ生成がクライアント側で行われる場合、サーバーは多かれ少なかれWebサービスのように動作し、アプリケーションに適した形式でのみデータを送り返します。JSONとXMLは、今日のほとんどのWebサービスで非常に人気のある形式です。クライアントは常に必要なHTMLとJSを生成します。このアプローチを使用する場合は、クライアントとサーバーの境界を明確に定義する必要があります。クライアントはサーバーで何が起こるかについての知識が限られているため、これは適切なエラーコードを定義する必要があることを意味します。ほとんど/すべてのサーバーの相互作用が非同期で行われるため、状態管理はより困難になります。このアプローチでコメントを追加する例は、次のようになります。
$('#add-comment').click(function() {
var comment = $('#comment-box').text();
$.ajax('http://example.com/add', {
success: function() {
addCommentRow(comment);
},
...
});
});
function addCommentRow(comment) {
var user = currentUser().name;
var html = "<li><b>{user}</b> says {comment}</li>";
html = html.replace("{user}", user).replace("{comment}", comment);
var item = $('<li>').html(html);
$('#comments').append(item);
}
もう1つのアプローチは、サーバー側ですべてを実行することです。変更が発生するたびに、サーバーにリクエストを送信し、サーバーに更新されたビューを要求します。バックエンドが高速で、応答時間が1秒未満で、ネットワークアクティビティの適切なインジケーターがあれば、サーバーですべてが発生しているにもかかわらず、アプリケーションは非常に応答性が高いように見えます。上記の例は次のように簡略化されます。
$('#add-comment').click(function() {
$.ajax('http://example.com/add', {
success: function(response) {
$('#comments').html(response);
},
...
});
});
これは、以前のアプローチよりもクライアント側ではるかにクリーンに見えますが、マークアップ生成をサーバーに移動したところです。ただし、アプリケーションがGoogleマップのようにAJAXyでない場合は、このアプローチの方が扱いやすい場合があります。繰り返しになりますが、アプリケーションがどれほど複雑かという問題であり、おそらく状態のクライアント側を維持することが必要です。その場合は、前のアプローチを使用することをお勧めします。