Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #651 (permalink)  
Старый 10.02.2016, 20:15
Аспирант
Отправить личное сообщение для Max Power Посмотреть профиль Найти все сообщения от Max Power
 
Регистрация: 15.12.2015
Сообщений: 83

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

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

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


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


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

Так? Я правильно все понял?
Ответить с цитированием
  #652 (permalink)  
Старый 10.02.2016, 20:17
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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

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

Последний раз редактировалось kobezzza, 10.02.2016 в 20:21.
Ответить с цитированием
  #653 (permalink)  
Старый 10.02.2016, 20:20
Аспирант
Отправить личное сообщение для Max Power Посмотреть профиль Найти все сообщения от Max Power
 
Регистрация: 15.12.2015
Сообщений: 83

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

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

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

Так чтоли?
Ответить с цитированием
  #654 (permalink)  
Старый 10.02.2016, 20:26
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Я же говорю, 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
code monkey

Последний раз редактировалось kobezzza, 10.02.2016 в 20:29.
Ответить с цитированием
  #655 (permalink)  
Старый 10.02.2016, 20:35
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 10.02.2016 в 20:38.
Ответить с цитированием
  #656 (permalink)  
Старый 10.02.2016, 20:48
Аспирант
Отправить личное сообщение для Max Power Посмотреть профиль Найти все сообщения от Max Power
 
Регистрация: 15.12.2015
Сообщений: 83

> Да. Но разумеется можно генерить что угодно, а не только 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.

Ну как идея?
Ответить с цитированием
  #657 (permalink)  
Старый 10.02.2016, 20:52
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Я думал тебе 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

Цитата:
Ну как идея?
И так СС может
__________________
kobezzza
code monkey
Ответить с цитированием
  #658 (permalink)  
Старый 10.02.2016, 20:53
Аспирант
Отправить личное сообщение для Max Power Посмотреть профиль Найти все сообщения от Max Power
 
Регистрация: 15.12.2015
Сообщений: 83

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

Щикааарно!
Ответить с цитированием
  #659 (permalink)  
Старый 10.02.2016, 20:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

kobezzza, пара вопросов, если не сложно,
по работе с http://codepen.io/ что там нужно нажать чтоб посмотреть результат на полный экран full?
и Snakeskin для ie не предназначен?
Ответить с цитированием
  #660 (permalink)  
Старый 10.02.2016, 20:57
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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

Цитата:
по работе с http://codepen.io/ что там нужно нажать чтоб посмотреть результат на полный экран full?
Change View
__________________
kobezzza
code monkey
Ответить с цитированием
Ответ



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

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


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