JavaScript играет все более важную роль в большинстве веб-решений, но я считаю, что гораздо сложнее отделить код 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 разделена на два файла - первый - это мой класс "бизнес-логики", а второй используется главным образом для проводки:
(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);
И проводкаpart:
$(document).ready(function () {
$('#signin a').live('click', function () {
var form = $(this).closest('form').serialize();
pressplay.account.authenticate(form);
return false;
});
});
Проблема с кодом выше заключается в том, насколько тесно он связан с тем, как выглядит представление (идентификаторы элементов, которые должны присутствовать, структура и т. д.), но у меня нет хороших идей о том, какэто может быть улучшено.
Мне просто кажется, что, если я продолжу идти по этому пути, файлы JS окажутся в беспорядке должным образом инкапсулированной логики в сочетании со всеми видами специфических для представления вещей.
Этолучшее, что я могу надеяться сделать, или есть какие-то методы, которые я могу применить, чтобы избежать этой путаницы?
Мои собственные идеи о том, как улучшить это вращение вокруг создания каких-то сгенерированных на стороне сервера "селекторов элементов"Класс JS, такой, что я мог написать JS, не используя столько строковых ссылок на классы и идентификаторы элементов.Но я не уверен, как можно было бы сгенерировать это или будет хуже в конце поддерживать.