Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Snakeskin (https://javascript.ru/forum/project/35057-snakeskin.html)

kobezzza 28.11.2013 16:47

Цитата:

Сообщение от nerv_ (Сообщение 283310)
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}

nerv_ 28.11.2013 17:34

Цитата:

Сообщение от kobezzza
Сам шаблонизатор не знает ни про какие событие и прочее, но необходимую логику я задаю через вызовы фильтров или функций внутри шаблона

Цитата:

Сообщение от kobezzza
Сам Snakeskin - это просто транслятор и микролиба (фильтры + итераторы) и ничего больше.

я это понял, но поскольку у меня нет
Цитата:

Сообщение от kobezzza
фильтры el и elMod и т.д. являются часть моего фреймворка который реализует паттерн БЭМ

думаю, как мне лучше поступить :) И пока мой выбор склоняется в пользу DOM Level 0 - через атрибуты
<div onclick="fn(this)"></div>

kobezzza 28.11.2013 18:56

Цитата:

Сообщение от nerv_ (Сообщение 283339)
я это понял, но поскольку у меня нет

думаю, как мне лучше поступить :) И пока мой выбор склоняется в пользу DOM Level 0 - через атрибуты
<div onclick="fn(this)"></div>

Как частное решение может подойти, но много подводных камней вроде не возможности установить таким образом событие на погружение и т.д.

nerv_ 28.11.2013 21:41

Цитата:

Сообщение от kobezzza
Как частное решение может подойти, но много подводных камней вроде не возможности установить таким образом событие на погружение и т.д.

Вот поэтому я и пытаюсь у тебя выпытать как лучше поступить, но пока не получается :)

kobezzza 28.11.2013 21:50

Цитата:

Сообщение от nerv_ (Сообщение 283381)
Вот поэтому я и пытаюсь у тебя выпытать как лучше поступить, но пока не получается :)

Ну тут думать особо нечего, если хочешь декларативщину в шаблоне, то придумываешь завязку на data- атрибутах аля ангулях или нокаут и делегируеш:)

Шаблон же это простая яваскриптовая функция, которая выплёвывает текст, который затем в innerHTML пихается, т.е. можно делегировать как угодно :)

У меня "свои" обработчики пишутся не в шаблоне, а в коде блока. А обработчики для связи 2-х разных блоков в шаблоне как декларативные схемы.

PS: а если тебе нужен дата-биндинг почему бы не взять один из уже имеющихся популярных фреймворков, или у тебя спортивный интерес/узкозаточенная задача ?

nerv_ 28.11.2013 21:56

kobezzza, спасибо за ответы и терпение :) Форум, как обычно, не плюсует.

kobezzza 28.11.2013 21:58

Цитата:

Сообщение от nerv_ (Сообщение 283385)
kobezzza, спасибо за ответы и терпение :) Форум, как обычно, не плюсует.

Нез, мне не сложно:)

nerv_ 30.11.2013 00:00

А это должно работать? http://jsfiddle.net/NAPWB/5/

kobezzza 30.11.2013 10:13

Цитата:

Сообщение от nerv_ (Сообщение 283620)
А это должно работать? http://jsfiddle.net/NAPWB/5/

Не:) Вложенные шаблоны не допускаются, тебе надо было сделать что-то вроде:

{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

nerv_ 30.11.2013 16:07

Цитата:

Сообщение от kobezzza
Вложенные шаблоны не допускаются

я так и понял :) За пример спасибо. Мне как раз нужно включение шаблонов друг в друга.


Часовой пояс GMT +3, время: 15:55.