Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #51 (permalink)  
Старый 28.11.2013, 16:47
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 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
code monkey

Последний раз редактировалось kobezzza, 28.11.2013 в 18:54.
Ответить с цитированием
  #52 (permalink)  
Старый 28.11.2013, 17:34
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от kobezzza
Сам шаблонизатор не знает ни про какие событие и прочее, но необходимую логику я задаю через вызовы фильтров или функций внутри шаблона
Сообщение от kobezzza
Сам Snakeskin - это просто транслятор и микролиба (фильтры + итераторы) и ничего больше.
я это понял, но поскольку у меня нет
Сообщение от kobezzza
фильтры el и elMod и т.д. являются часть моего фреймворка который реализует паттерн БЭМ
думаю, как мне лучше поступить И пока мой выбор склоняется в пользу DOM Level 0 - через атрибуты
<div onclick="fn(this)"></div>
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #53 (permalink)  
Старый 28.11.2013, 18:56
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от nerv_ Посмотреть сообщение
я это понял, но поскольку у меня нет

думаю, как мне лучше поступить И пока мой выбор склоняется в пользу DOM Level 0 - через атрибуты
<div onclick="fn(this)"></div>
Как частное решение может подойти, но много подводных камней вроде не возможности установить таким образом событие на погружение и т.д.
__________________
kobezzza
code monkey
Ответить с цитированием
  #54 (permalink)  
Старый 28.11.2013, 21:41
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от kobezzza
Как частное решение может подойти, но много подводных камней вроде не возможности установить таким образом событие на погружение и т.д.
Вот поэтому я и пытаюсь у тебя выпытать как лучше поступить, но пока не получается
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #55 (permalink)  
Старый 28.11.2013, 21:50
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от nerv_ Посмотреть сообщение
Вот поэтому я и пытаюсь у тебя выпытать как лучше поступить, но пока не получается
Ну тут думать особо нечего, если хочешь декларативщину в шаблоне, то придумываешь завязку на data- атрибутах аля ангулях или нокаут и делегируеш

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

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

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

Последний раз редактировалось kobezzza, 28.11.2013 в 21:57.
Ответить с цитированием
  #56 (permalink)  
Старый 28.11.2013, 21:56
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

kobezzza, спасибо за ответы и терпение Форум, как обычно, не плюсует.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #57 (permalink)  
Старый 28.11.2013, 21:58
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от nerv_ Посмотреть сообщение
kobezzza, спасибо за ответы и терпение Форум, как обычно, не плюсует.
Нез, мне не сложно
__________________
kobezzza
code monkey
Ответить с цитированием
  #58 (permalink)  
Старый 30.11.2013, 00:00
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

А это должно работать? http://jsfiddle.net/NAPWB/5/
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #59 (permalink)  
Старый 30.11.2013, 10:13
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от nerv_ Посмотреть сообщение
А это должно работать? 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
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 30.11.2013 в 10:47.
Ответить с цитированием
  #60 (permalink)  
Старый 30.11.2013, 16:07
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от kobezzza
Вложенные шаблоны не допускаются
я так и понял За пример спасибо. Мне как раз нужно включение шаблонов друг в друга.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
express-snakeskin - view через snakeskin для express melky Ваши сайты и скрипты 5 10.06.2014 11:35