JavaScript はほとんどの Web ソリューションでますます重要な役割を果たしていますが、JS コードをビューの仕様から分離することは、サーバー側のコードよりもはるかに難しいことがわかりました。
メンテナンスの負担を軽減し、マイナーなビューの変更に対して可能な限り回復力を持たせるために、JS コードを分離するために人々はどのような手法を使用していますか?
具体的な例を提供するために、次のようなビューがあります。
<div id="signin" class="auth">
<h2>Sign in</h2>
<div id="resultbox" class="box" style="display: none;"></div>
<div class="form">
<p>Required fields are marked <span class="yellow">*</span></p>
<form action="@Url.Action( MVC.Account.Authenticate() )" method="post" id="authform">
<label for="Identification">Alias or email <span class="yellow">*</span></label></p>
@Html.TextBoxFor( m => m.Identification, new { size="22", tabindex="1" } )
<label for="Password">Password <span class="yellow">*</span></label></p>
@Html.PasswordFor( m => m.Password, new { size="22", tabindex="2" } )
<a href="#" class="but_styled" id="btn_signin" tabindex="3">Sign in</a>
</form>
</div>
</div>
JS 部分は 2 つのファイルに分割されます。1 つ目は「ビジネス ロジック」クラスで、2 つ目は主に配線に使用されます。
(function (pp, $, undefined) {
pp.account = {};
function hideResultBox() {
var box = $('#resultbox');
box.hide();
box.removeClass('info_box').removeClass('error_box');
}
function showResultBox(result) {
var box = $('#resultbox');
if (result.Success === true) {
$('#resultbox_content').html(result.Message);
box.addClass('info_box').show();
} else {
$('#resultbox_content').html(result.Message);
box.addClass('error_box').show();
var messages = '';
for (var error in result.Errors) {
messages += '<li>' + result.Errors[error] + '</li>';
}
if (messages !== '')
$('#resultbox_content').append('<br /><ul>' + messages + '</ul>');
}
}
pp.account.authenticate = function (data) {
hideResultBox();
$.post('/account/authenticate', data, function (result) {
showResultBox(result);
if (result.Success === true) {
setTimeout(function () { window.location = result.Url; }, 1000);
}
});
};
})(window.pressplay = window.pressplay || {}, jQuery);
そして配線部分:
$(document).ready(function () {
$('#signin a').live('click', function () {
var form = $(this).closest('form').serialize();
pressplay.account.authenticate(form);
return false;
});
});
上記のコードの問題は、ビューの外観 (存在しなければならない要素 ID、構造など) と密接に結びついていることですが、それを改善する方法については良い考えがありません。
この道を進み続けると、JS ファイルは、あらゆる種類のビュー固有のものと組み合わされた適切にカプセル化されたロジックの混乱になってしまうように思えます。
これは私が望むことができる最善の方法ですか、またはこの混乱の一部を回避するために適用できるテクニックはありますか?
これを改善する方法に関する私自身のアイデアは、サーバー側で生成されたある種の「要素セレクター」JS クラスを構築することを中心に展開しています。これにより、クラスと要素 ID への文字列参照をそれほど多く使用せずに JS を記述できます。しかし、それをどのように生成するのか、または最終的に維持するのが悪いのかどうかはわかりません。