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

Max Power 10.02.2016 20:15

> /// Т.к. у нас результатом шаблона будет JSON

Вот это уже почти в цель. В целом мой конкретный юзкейс это решит неплохо, пусть и совсем не так как я хотел.

Если же рассматривать проблему более широко (формулировка):


Можно ли передать произвольные структурированные данные из шаблона в контроллер


- то ответ будет - да, можно - создай шаблон-коллектор данных, там все разбери в JSON как надо и этот JSON можешь уже юзать в контроллере.

Так? Я правильно все понял?

kobezzza 10.02.2016 20:17

Цитата:

Так? Я правильно все понял?
Да. Но разумеется можно генерить что угодно, а не только JSON.

Цитата:

пусть и совсем не так как я хотел.
Ну если ты не хочешь создавать шаблон коллектор, то без проблем - просто сохрани каждый файл шаблона как JS файл и вызывай их уже через галп и там всё формируй, но мне как то такой вариант не нравится.

Max Power 10.02.2016 20:20

> /// Вернёт <div class="hello"></div>

А что значит "вернет"? Вернет вызвавший шаблон, или в контроллер? (я так понял что первый вариант)

Вообще, что возвращается в контроллер? Две сущности как обычно
1) результат компиляции (какой-то внутренний пофигу какой формат)
2) результат конечного рендера - строка

Так чтоли?

kobezzza 10.02.2016 20:26

Я же говорю, SS это язык, который транслируется в JS, как CoffeScript или TypeScript.

Непосредственным результатом работы транслятора является JS файл, грубо говоря

- namespace foo

- template bar()
  < .foo


Скомпилится в

if (typeof foo === undefined) {
  var foo = {};
}

module.exports = foo;

foo.bar = function bar() {
  return '<div class="foo"></div>';
}


И дальше мы этот файл подключаем уже в своём JS и работаем с ним как с JS функциями. А вот сами функции в зависимости режима компиляции могут возвращать разные результаты.

kobezzza 10.02.2016 20:35

http://codepen.io/kobezzza/pen/zrJNXx

Вот тут для понимания важны 2 строчки:

// Компилируем шаблоны
Snakeskin.compile(document.getElementById('templates'));

// Вызываем наш скомпилированный шаблон, как простую JS функцию
document.getElementById('test').innerHTML = demo.helloWorld();


http://codepen.io/kobezzza/pen/GoPNZx

А вот тут я продекларировал шаблон, который возвращает не строку, а DocumentFragment.

Max Power 10.02.2016 20:48

> Да. Но разумеется можно генерить что угодно, а не только JSON.

Но на самом деле у нас вот здесь

> {contents|json|!html}

contents - это объект JS. И в контроллере в моем случае нужен объект JS. Но в текущей реализации понадобится этот объект перегнать в строку (JSON), а потом эту строку перегнать обратно в объект.

Внутри шаблона мы вольны оперировать как угодно объектами JS и собрать что угодно из чего угодно. Вот бы это "что угодно" можно было бы в контроллер вытаскивать - это стало бы киллер-фичей, *я гарантирую это*

Например:

шаблон:
....
connector myData
  ~ // do something with data
  ~
  ~ var myVar = <get something from outer template scope>.someMethod() + something // ..etc 
  ~ ...
  ~ var bar = <get something from outer template scope>.someMethod() + something // ..etc 
  ~ myVar.foo = bar.
  ~ ...
  ~ // do something with data
  share bar, myVar
....


я не знаю синтаксис SS, тильду (~) использовал для того чтобы ничего не делать с тем что за ней - так какие-то манипуляции с данными, которые видеть ни откуда не нужно. Если ничего делать с данными не нужно - можно сразу - share bar, myVar

в контроллере:
var tpl = ss('my_tpl.ss'); // не знаю как там, но суть ясна
var bar = tpl.connectors.myData.bar;
var myVar = tpl.connectors.myData.myVar;


Коннекторы - это "обратный билет" для данных в контроллер.

Конкретно мой юзкейс - я бы сдалал так:
1) Создал бы родительский шаблон для всех постов, в нем бы создал коннектор.
2) В галпфайле в процессе рендера html-файлов всех постов параллельно бы получил данные из всех коннекторов.
3) Профит, нужные данные контроллер получил, дальше как угодно, это же объекты JS.

Ну как идея?

kobezzza 10.02.2016 20:52

Я думал тебе JSON нужен :)

- namespace contents
- include 'posts/*'

- template main()
  - var contents = []

  - forEach posts => post
    ? contents.push({preview: post.preview(), content: post.main()})

  /// Явно указываем return,
  /// чтобы результатом был исходный массив
  - return contents


Цитата:

Вот бы это "что угодно" можно было бы в контроллер вытаскивать - это стало бы киллер-фичей, *я гарантирую это*
Это всё уже можно сейчас. SS позволяет общаться с JS в обе стороны, что логично - ибо он компилируется в JS :)

Цитата:

Ну как идея?
И так СС может :)

Max Power 10.02.2016 20:53

> codepen.io/kobezzza/pen/zrJNXx
> codepen.io/kobezzza/pen/GoPNZx

Щикааарно!

рони 10.02.2016 20:53

kobezzza, пара вопросов, если не сложно,
по работе с http://codepen.io/ что там нужно нажать чтоб посмотреть результат на полный экран full?
и Snakeskin для ie не предназначен?

kobezzza 10.02.2016 20:57

Цитата:

и Snakeskin для ie не предназначен?
Там просто нужно подгрузить библиотеку полифилов, поправлю. Транслятор работает в ES5 VM + немножко полифилов нужно загрузить, а вот сами скомпиленые шаблоны поддерживают ES3.

Цитата:

по работе с http://codepen.io/ что там нужно нажать чтоб посмотреть результат на полный экран full?
Change View


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