JavaScript шаблонизатор
Конечно шаблонизатор это очень громко сказано, но все же это попытка разнести данные и представление по разным углам. Но пока я не нашел этому реального применения, я не хотел постить это в блог и это было в моей голове и на форуме, а теперь я собираюсь использовать это в проекте и созрел запостить тут, может кто-то что-то умное скажет.
Сам вопрос довольно прост, надо сделать сопряженные выпадающие списки, то есть выбрал что-то в одном, поменялись варианты ответов в другом, естественно ajax'ом. Как правильно собрать содержимое select'a в кучу если проходит JSON?!
Итак представим наш код
$.ajax({
url : "my/back/end.json",
type : "json",
success : function (result) {/**/}
});
Вот, собственно, и надо реализовать функцию success. Учитывая что формат ответа:
[
{value:1,name:"CTAPbIu_MABP"},
{value:2,name:"Vasya Pupkin"},
{value:3,name:"%UserName%"}
]
Подавляющее большинство делает что-то вроде
function(result)
var html = "";
$(result).each(function(i, val) {
/*
* Предполагаю что хватает ума не писать ересь типа
* $('select#id').append('<option value="' + val.value + '">' + val.name + '</option>');
*/
html += '<option value="' + val.value + '">' + val.name + '</option>';
});
$('select#id').html(html);
}
Но если бы меня устраивало я бы не писал эту статью. Из этого надо выделить данные, они у меня в переменной result, и шаблон из <option ...>. Выделил, теперь переписываю.
var template = '<option value="[value]">[name]</option>';
...
function (result) {
var html = "";
$(result).each(function(i, val){
html += template.replace(/(\[([^\[\]]+)\])/g, function($0, $1, $2){
return val[$2] || "";
});
});
$('select#id').html(html);
}
Что тут происходит? есть шаблон, который скорее всего будет браться откуда-то из вне. В шаблоне есть плейсхолдеры [key], имя плейсхолдера это свойство в получаемом объекте. регулярным выражением я заменяю плейсхолдеры на полученные данные, если в данных присутствует плейсхолдер, он так и останется плейсхолдером, потому что строка повторно не обрабатывается, если значения свойства не определено подставляется пустая строка.
Осталось придумать как натянуть все это целую форму...
Updated 29.06.10 Это все приобрело финальную форму и успешно используеться уже во втором проекте:
function T (data, template) {
var html = "";
$(data).each(function(key, val){
html += template.replace(/(\[([^\[\]]+)\])/g, function($0, $1, $2){
return val[$2] || "";
});
});
return html;
}
Зачем тут select? Для замедления выборки?
1) юзер запрос и инициализация Аякса.
2) Аякс бекенд получает данные и шаблон отображения из внешнего файла.
3) Посылка данных на фронтенд: сугубо данных и шаблона отображения.
3) Яваскрипт-фронтенд Аякса сшивает данные и шаблон и плюет в браузер? Верно?
или я что-то не так понял :-).
Если все так, то зачем сшивать данные в яваскрипте, если можно все склеить (данные+шаблон отображения) еще в бекэнде и выплюнуть фронтенд-яваскрипту готовую строку для отображения?
шаблон зашит во фронт энд а с бекенда поступают только данные
поправил что бы больше не путать :)
а если использовать плагин
http://benalman.com/projects/jquery-getobject-plugin/
можно вообще красиво поступить
При большом паттерне (и не одном) есть смысл вынести их в отдельный файл (т.к. меняются они довольно редко).
Я использовал что-то похожее на шаблонизацию при написании пересчитывающейся таблицы (а-ля excel). В ней использовались формулы, записанные в стиле экселя + предопределенные константы. Сами формулы были записаны строками. При расчете адреса ячеек заменялись на значения инпутов внутри td с соответствующим ID и eval'ились.
а можно гдето увидеть или это для внутренних целей?
Я извиняюсь за тупость, просто для себя проясню вопрос :-)
1. Шаблон НЕ читается яваскриптом из внешнего файла - это НЕВОЗМОЖНО в принципе.
2. Шаблон висит в теле документа и скажем скрыт css'ом
да не все нормально, я не претендую на то что всегда способен внятно описывать словами поток своего сознания.
пока что шаблон это просто строковая переменная в JS
но вообще надо как-то придумать чтобы это был именно кусок html скрытый css
я уже пробовал парсить html и находя в инпуте имя подставлять ему в значение элемент из массива... получается не кошерно
Я просто подумал, что может есть какой-то революционный способ читать из внешних файлов на яваскриптах, думаю ого! Отстал от жизни...
1) Дано:
- html-файл: index.html
- html-шаблон: template.html
2) Нужно:
- получить содержимое template.html в index.html с помощью яваскриптовой логики.
нема за шо ;)
Вобщем глянь TrimPath Projects -> http://code.google.com/p/trimpath/
Там есть темплейты реализованые на JS, формат шаблона как в Velocity.
Может будет полезно. Сам гдето юзал, очень понравилось :)
Если будет интересно, попробую даже найти работающий код :)
вот template-data.json:
Код вырезал из бизнес логики, потому может в html напартачил, но принцип должен быть понятным :)
Если тебе не будет полезно, может кому еще понадобится :)
я тебе чтото сказал по поводу того что я люблю смарти? я его не люблю. просто синтаксис похож
не ну что я его в свое время юзал, а потмо кк грибы появились всякие квики и остальные
лолололо
:)
ты ололошник