Ответ 1
-
Хорошая абстракция, соответствующая инженерам на стороне клиента, использует принцип построения и изменения dom. В этом отношении он "чище", потому что есть одна ментальная модель. Его также приятно, потому что нам не нужно смешивать kluge разрозненных синтаксисов с языком шаблонов поверх другой чистой декларативной разметки, как в случае даже с "самой тупой" системой шаблонов, например усами.
-
Я бы не сказал, что более эффективно использовать jsdom для шаблонов. Пойдите, возьмите gander в google, чтобы "утечка памяти с jsdom" например. jsdom is rad, и он очень полезен для задач, таких как выходные проекты для обхода сайтов, выполняя задачи, не связанные с сервером, но я думаю, что это медленное, как дерьмо с точки зрения высокопроизводительного веб-сервера.
-
Есть миллиард способов повлиять на это. Никакой метод не появился как "стандартный" способ. Один из способов, который я видел, - отправить пустой "шаблон", т.е. Блок html, который каким-то образом представляет модель, а затем использовать это для загрузки исходного кода из модели. Из этой статьи, например:
<li class="contact" id="contact-template">
<span class="name"></span>
<p class="title"></p>
</li>
Это "взгляд" в классическом отношении. В типичном веб-приложении он может выглядеть примерно так:
<li class="contact">
<span class="name"><?= $name ?></span>
<p class="title"><?= $title ?></p>
</li>
Чтобы использовать mvc, вы устанавливаете контроллер, который смутно осознает семантику вышеуказанного представления и модели, которую он представляет. Это представление анализируется в /DOM и доступно через ваш любимый механизм выбора. Каждый раз, когда модель представляет собой изменения, вы можете использовать события изменения или обратные вызовы для обновления представления. Например:
Позволяет себе представить, что "model" запускает событие "change" каждый раз, когда изменяется свойство.
controller = new Controller({
view: $('#contact-template').clone(), // Assume jquery or whatever
model: aContact
});
// Assume some initialization that sets the view up for the first time
// and appends it to the appropriate place. A la:
// this.view.find('.name').text(model.name);
// this.view.find('.title').text(model.title);
// this.view.appendTo('#contacts')
controller.on('model.name.change', function(name){
this.view.find('.name').text(name);
});
Вот такие системы, как Weld и Backbone.js, для вас. Все они имеют разные предположения о том, где эта работа происходит (на стороне сервера, на стороне клиента), в какой структуре вы используете (jquery, mootools и т.д.) И о том, как ваши изменения распространяются (REST, сокет. io и т.д.).
Изменить
Некоторые действительно полезные вещи, которые вы можете сделать с jsdom, вращаются вокруг тестирования интеграции и spidering:
- https://github.com/mikeal/spider - веб-паук общего назначения, который использует обработку событий на основе node и дает вам jsdom/jquery, чтобы помочь вам легко получить доступ к DOM в программный путь
- https://github.com/assaf/zombie - безболезненное тестирование браузера с использованием jsdom/jquery для тестов интеграции
- https://github.com/LearnBoost/tobi - аналогичное тестирование браузера без браузера
Лично я хотел бы увидеть проект, который использовал подход tobi, но сопоставил его над чем-то вроде https://github.com/LearnBoost/soda, чтобы мы могли облачно селеновое тестирование без селенеза (поскольку imo, это отстой).