Показать сообщение отдельно
  #3 (permalink)  
Старый 08.10.2011, 19:32
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Kolyaj
Это всё последствия использования with. Я ушёл от него к использованию this при обращении к переданным переменным, т.е. шаблону не передаётся объект с данными, а шаблон вызывается в контексте объекта с данными.
тут не в with проблема, он никак не мешает использовать this, так как ты его используешь, но при нем уже есть выбор: если переменная обязательна в шаблоне, вплоть до того, что даже хорошо, что происходит ошибка при ее отсутствии, тогда пишем без this (пишем так в шаблоне не ради ошибки, а потому что точно уверены, что переменная есть), а через this обращаемся уже к необязательным переменным.

Что касается выбора между viewData и this, я сам долго присматривался к this на эту роль, но потом мыслил так: шаблон - это в некотором смысле обычная функция (после "компиляции" вообще так и есть), такой более удобный способ записи функций определенного типа, и если обычную функцию можно запустить в любом контексте, то чем хуже шаблон? Именно поэтому fn запускается через call - перебрасывается контекст. Да я понимаю, что аргумент не очень, но и контраргументы тоже слабые: this короче, автокомплит полностью решает проблему, ну и свойства viewData в viewData быть не должно. Так же на выбор повлиял ASP MVC Framework, там тоже есть viewData и свойства класса отвечающего за страницу можно использовать как переменные в шаблоне, правда там viewData.x !== x , а у меня они равны. Оттуда же экранирующие вставки, но там, кажется, нет возможности свой escape поставить, точно не помню про это. Для полноты картины можно еще сделать вставки для подгрузки подшаблонов <%@filename%>, но это уже надо делать на уровне функции load, сам compile никакими загрузками заниматься не должен, как-то так (не запускал):
var cache = {};

var fs = require('fs');

function load(filename) {
	if (filename in cache) {
		return cache[filename];
	}
	var strTpl = fs.readFileSync(filename, 'utf8');
	strTpl = strTpl.replace(/<%@([\s\S]+?)%>/g, function($0, $1) {
		return load($1);
	});
	return cache[filename] = compile(strTpl);
}

exports.load = load;

function clearCache() {
	cache = {};
}

exports.clearCache = clearCache;


Kolyaj, а вот этот кусок:
Сообщение от Riim
[$1].join('')
сразу понятно зачем он?
Ответить с цитированием