Это распространенная проблема, которая становится все более очевидной по мере увеличения сложности пользовательского интерфейса, и необходимо вносить изменения как в шаблоны сервера, так и в шаблоны клиентов.Эту проблему можно исправить, используя одинаковую разметку шаблона как на стороне клиента, так и на стороне сервера.Процессоры шаблонов должны быть написаны как на JavaScript, так и на серверном языке.
Два других решения, более чистых, чем описанный выше подход, но оба имеют свои проблемы:
- Делать всена стороне клиента
- Делать все на стороне сервера
Если вся генерация разметки выполняется на стороне клиента, то сервер действует более или менее как веб-служба, которая отправляет данные только во что бы то ни былоформаты подходит для приложения.JSON и XML в настоящее время являются действительно популярными форматами для большинства веб-сервисов.Клиент всегда генерирует необходимый 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);
}
Другой подход - делать все на стороне сервера.Всякий раз, когда происходит изменение, отправьте запрос на сервер и запросите обновленный вид.С быстрым бэкэндом, временем отклика менее секунды и правильными показателями сетевой активности приложение должно казаться очень отзывчивым, несмотря на все происходящее на сервере.Приведенный выше пример будет упрощен до:
$('#add-comment').click(function() {
$.ajax('http://example.com/add', {
success: function(response) {
$('#comments').html(response);
},
...
});
});
Хотя это кажется намного более понятным на стороне клиента, чем при предыдущем подходе, мы только что перенесли генерацию разметки на сервер.Однако, если приложение не очень AJAXy, как Google Maps, тогда с этим подходом будет проще работать.Опять же, вопрос заключается в том, насколько сложным является приложение, и, возможно, вам необходимо поддерживать состояние клиента на стороне, и в этом случае вы можете использовать предыдущий подход.