28.11.2013, 16:47
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от nerv_
|
kobezzza, у меня возник глупый вопрос: как ты навешиваешь обработчики событий для шаблонизируемых элементов? Через делегирование?
Хочется максимально простого и понятного кода. Допустим, когда я использую ангуляр, я пишу так:
<div ng-repeat="item in array"> <!-- повторить див столько раз, сколько элементов в массие -->
<div ng-click="controller.click(item)"></div> <!-- навесить обработчик клика на каждый элемент -->
</div>
// упрощенный js
var controller = {
click: function(item) {
// item - элемент модели, по кот. кликнули
}
};
можно ли как-нибудь добиться подобного поведения?
Так же хочется услышать/увидеть, как ты навешиваешь обработчики с данным шаблонизатором.
|
Сам шаблонизатор не знает ни про какие событие и прочее, но необходимую логику я задаю через вызовы фильтров или функций внутри шаблона, пример:
{template bButton.prototype.tpl()}
<div class="{this|el 'cont'|elMod 'focus', 'true'}">
</div>
{end}
Тут фильтры el и elMod и т.д. являются часть моего фреймворка который реализует паттерн БЭМ, т.е. это отдельная хреновина не имеющая отношения к шаблонизатору.
Сам Snakeskin - это просто транслятор и микролиба (фильтры + итераторы) и ничего больше.
PS: раз уж тут отметился, то скажу, что в декабре хочу запилить новую версию с поддержкой доопределения блоков и прототипов (сейчас есть только переопределение), т.е. что-то вроде:
{template page()}
{block scripts}
<script src="1"></script>
<script src="2"></script>
{end}
{end}
{template page2() extends page}
{block scripts}
{super} /// будет заменено на block scripts из page
<script src="3"></script>
{end}
{end}
Сейчас похожее можно сделать с помощью миксина из блоков и прототипов, но выглядит это криво.
{template page()}
{proto scripts}
<script src="1"></script>
<script src="2"></script>
{end}
{block scripts}
{apply scripts}
{end}
{end}
{template page2() extends page}
{proto page2_scripts}
<script src="3"></script>
{end}
{block scripts}
{apply scripts}
{apply page2_scripts}
{end}
{end}
Последний раз редактировалось kobezzza, 28.11.2013 в 18:54.
|
|
28.11.2013, 17:34
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от kobezzza
|
Сам шаблонизатор не знает ни про какие событие и прочее, но необходимую логику я задаю через вызовы фильтров или функций внутри шаблона
|
Сообщение от kobezzza
|
Сам Snakeskin - это просто транслятор и микролиба (фильтры + итераторы) и ничего больше.
|
я это понял, но поскольку у меня нет
Сообщение от kobezzza
|
фильтры el и elMod и т.д. являются часть моего фреймворка который реализует паттерн БЭМ
|
думаю, как мне лучше поступить И пока мой выбор склоняется в пользу DOM Level 0 - через атрибуты
<div onclick="fn(this)"></div>
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
28.11.2013, 18:56
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от nerv_
|
я это понял, но поскольку у меня нет
думаю, как мне лучше поступить И пока мой выбор склоняется в пользу DOM Level 0 - через атрибуты
<div onclick="fn(this)"></div>
|
Как частное решение может подойти, но много подводных камней вроде не возможности установить таким образом событие на погружение и т.д.
|
|
28.11.2013, 21:41
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от kobezzza
|
Как частное решение может подойти, но много подводных камней вроде не возможности установить таким образом событие на погружение и т.д.
|
Вот поэтому я и пытаюсь у тебя выпытать как лучше поступить, но пока не получается
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
28.11.2013, 21:50
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от nerv_
|
Вот поэтому я и пытаюсь у тебя выпытать как лучше поступить, но пока не получается
|
Ну тут думать особо нечего, если хочешь декларативщину в шаблоне, то придумываешь завязку на data- атрибутах аля ангулях или нокаут и делегируеш
Шаблон же это простая яваскриптовая функция, которая выплёвывает текст, который затем в innerHTML пихается, т.е. можно делегировать как угодно
У меня "свои" обработчики пишутся не в шаблоне, а в коде блока. А обработчики для связи 2-х разных блоков в шаблоне как декларативные схемы.
PS: а если тебе нужен дата-биндинг почему бы не взять один из уже имеющихся популярных фреймворков, или у тебя спортивный интерес/узкозаточенная задача ?
Последний раз редактировалось kobezzza, 28.11.2013 в 21:57.
|
|
28.11.2013, 21:56
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
kobezzza, спасибо за ответы и терпение Форум, как обычно, не плюсует.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
28.11.2013, 21:58
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
|
|
30.11.2013, 00:00
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
30.11.2013, 10:13
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Не Вложенные шаблоны не допускаются, тебе надо было сделать что-то вроде:
{template foo.tpl(name)}
<h1 onclick="bar.click(this)">Hello {name}!</h1>
{call this.header.tpl(name, 'ещё параметр')}
{/template}
/// Можно смело использовать неймспейсы любой длины, т.к. Snakeskin создаст их если что
{template foo.header.tpl(name, header)}
<h2>{header}</h2>
<h3>{name}</h3>
{/template}
НО
Для повторного использования кода в шаблоне и его дочерних шаблонах есть прототипы, которые в отличии от вызова шаблона в шаблоне не создают зависимостей, т.е.
{template base(name)}
{proto foo}
121
{/proto}
{apply foo}
{apply foo}
{/template}
Прототип может содержать в себе другие прототипы, блоки и т.д. В дочернем шаблоне можно переопределить и вызвать любой родительский прототип. Прототип не может вызывать сам себя, т.е.
{proto foo}
{apply foo}
{/proto}
не получится И главное, в скомпилированном шаблоне прототипы никак не фигурируют и не создают никаких связей, т.е. они используются только на этапе трансляции.
http://habrahabr.ru/post/168093/ здесь довольно исчерпывающее описание прототипов, хотя сама статья уже местами устарела, т.к. писалась для версии 1 почти год назад, а ща уже 2.4
Последний раз редактировалось kobezzza, 30.11.2013 в 10:47.
|
|
30.11.2013, 16:07
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от kobezzza
|
Вложенные шаблоны не допускаются
|
я так и понял За пример спасибо. Мне как раз нужно включение шаблонов друг в друга.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|