Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #561 (permalink)  
Старый 17.06.2015, 14:22
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Не нашёл в wiki, у snakeskin есть callback из скрипта, а ля Snakeskin(tpl, callback) или что-то типа Snakeskin.compile.then? Чтобы вызывался после активации DOM в шаблоне. callback в шаблоне не понял что делает.

Сейчас использую Snakeskin.hash[tplName] для рендеринга шаблона в DOM, так подключать нормально? в wiki тоже не нашёл описания про это.

Использую es6, про это тоже в вики немногословно.

Скомпиленные шаблоны подключены в header> menu.ss.js ... и т.д.

Если я что-то не нашёл, то просьба ткнуть носом или пояснить.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #562 (permalink)  
Старый 17.06.2015, 18:19
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Не совсем понял, что ты хочешь сделать. Ты имеешь ввиду, можно ли, чтобы результат шаблона отдавался по колбеку, а не сразу?

Цитата:
Сейчас использую Snakeskin.hash[tplName] для рендеринга шаблона в DOM, так подключать нормально? в wiki тоже не нашёл описания про это.
?

foo.ss

{template foo()}
    Hello World!
{/}


index.js

console.log(foo()); // Hello World!


Если не хочется писать в глобалспейс, то просто добавляем шаблону неймспейс, например tpls.foo

Цитата:
Использую es6, про это тоже в вики немногословно.
А что именно нужно? В SS7 появится поддержка некоторых ES6 фич, но врятли ты про это.

{void foo(...args)}
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 17.06.2015 в 18:34.
Ответить с цитированием
  #563 (permalink)  
Старый 17.06.2015, 19:02
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от kobezzza
Ты имеешь ввиду, можно ли, чтобы результат шаблона отдавался по колбеку, а не сразу?
Я написал обертку, с помощью которой я монтирую шаблон в DOM, а когда он вставлен и отображается в браузере делаю с ним разные действия, скрытие, показ и т.д. Типа onload на img.

Типа как тут:
insertTplIntoDOM('menu').then(function(){
//плавно скрываем первый элемент и уже точно известно, что элемент примонтирован и к нему есть доступ.
});

//где 'menu' это Snakeskin.hash['menu']


В принципе у меня обертка есть, я просто подумал, может есть из коробки. Или меня уже глючит и все вставляемые элементы уже доступны мгновенно после innerHTML=tpl?

Сообщение от kobezzza
А что именно нужно?
Мне пришлось гадать как подключить шаблоны в проект es6, оказалось я так понял никак, вернее также как и в es5, в <head><script snakeskin.js></head>

а в скрипте Snakeskin.hash[tplName] - тут получаем доступ к шаблону

Сообщение от kobezzza
не хочется писать в глобалспейс, то просто добавляем шаблону неймспейс, например tpls.foo
На этом месте я просто не понимаю, мозг не понимает без примера. Как подключать Snakeskin, что такое tpls в tpls.foo. tpls.foo это название шаблона?

{template tpls.foo()}
    Hello World!
{/}


Как вообще не писать в глобал? Snakeskin.hash[tplName] - это разве не локал?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #564 (permalink)  
Старый 17.06.2015, 20:45
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
Или меня уже глючит и все вставляемые элементы уже доступны мгновенно после innerHTML=tpl?
Конечно.

Цитата:
Мне пришлось гадать как подключить шаблоны в проект es6, оказалось я так понял никак, вернее также как и в es5, в <head><script snakeskin.js></head>
Для подключения скомпиленого шаблона можно использовать CommonJS, AMD и экспорт в глобал спейс.

https://github.com/SnakeskinTpl/Snak...world.ss.js#L6

Вот тут можно глянуть код после компиляции и увидеть логику.

Цитата:
Snakeskin.hash[tplName] - тут получаем доступ к шаблону
Да, так можно, только поправочка: Snakeskin.cache.

Цитата:
На этом месте я просто не понимаю, мозг не понимает без примера. Как подключать Snakeskin, что такое tpls в tpls.foo. tpls.foo это название шаблона?
Всё очень просто

{template foo()}
{/}


Тоже самое, что и

function foo() {
}


А

{template bar.foo()}
{/}


Тоже самое, что и

if (typeof bar === 'undefined') {
    var bar = {};
}

bar.foo = function foo() {
};


Неймспейс может называться как угодно и иметь любую вложенность, можно использовать точечную и скобочную нотацию: логика идентичная с JS.

{var fffuuu = 121}
{template car.bar['someStr' + fffuuu]foo()}
{/}


Можно ставить шаблоны, как методы JS класса

{template MyWidget.prototype.tpl()}
{/}


Цитата:
Как вообще не писать в глобал? Snakeskin.hash[tplName] - это разве не локал?
Использовать CommonJS или AMD. Логика такая: если есть exports, то шаблоны экспортируются туда, если есть функция define со свойством amd, то используется AMD, т.е. шаблон сам подстраивается под окружение.

Ещё можно просто обернуть полученный JS код функций и задать нужный this. Для таких задач удобно использовать конвеер сборки gulp/grunt с плагином wrap.

PS: отмечу, что в SS7 весь этот механизм значительно улучшен, например появилась поддержка runtime модулей и можно явно задать тип экспорта шаблонов.

{@= export 'es6'}
{import { getUserData } from './myLib.js'}

{template foo() @async}
   {forEach await getUserData() => @el}
       {@name} - {@age}
   {/}
{/}
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 17.06.2015 в 20:50.
Ответить с цитированием
  #565 (permalink)  
Старый 17.06.2015, 21:54
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

Сообщение от kobezzza Посмотреть сообщение
PS: отмечу, что в SS7 весь этот механизм значительно улучшен, например появилась поддержка runtime модулей и можно явно задать тип экспорта шаблонов.

{@= export 'es6'}
{import { getUserData } from './myLib.js'}

{template foo() @async}
   {forEach await getUserData() => @el}
       {@name} - {@age}
   {/}
{/}
О, офигенно!
Ответить с цитированием
  #566 (permalink)  
Старый 20.06.2015, 11:50
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Одна из важнейших фич SS7 будет открытость API парсера, т.е. сам пользователь сможет расширять язык своими директивами и поэтому я потратил кучу времени на рефакторинг существующего API и в итоге получился на мой взгляд очень простой, но в тоже время мощный интерфейс, вот например директивы switch-case-default на новом API:

import { Snakeskin } from '../core';

Snakeskin.addDirective(
	'switch',

	{
		block: true,
		notEmpty: true,
		inside: Snakeskin.group('case')
	},

	function (command) {
		this.append($=> `switch (${this.out(command, {sys: true})}) {`);
	},

	function () {
		this.append('}');
	}

);

Snakeskin.addDirective(
	'case',

	{
		block: true,
		notEmpty: true,
		group: 'case',
		replacers: {
			'>': 'case ',
			'/>': 'end case'
		}
	},

	function (command) {
		this.append($=> `case ${this.out(command, {sys: true})}: {`);
	},

	function () {
		this.append('} break;');
	}

);

Snakeskin.addDirective(
	'default',

	{
		block: true,
		group: 'case'
	},

	function () {
		this.append('default: {');
	},

	function () {
		this.append('}');
	}

);


Как вам?
__________________
kobezzza
code monkey
Ответить с цитированием
  #567 (permalink)  
Старый 20.06.2015, 22:41
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от kobezzza
Как вам?
Побольше примеров и хорошая документация, в остальном я хз, что оно делает .

Я пока из ss6 использую 40% и ума не приложу зачем мне больше, поэтому вряд ли буду полезен.

Для меня главное дока и предсказуемое поведение, в остальном пиши хоть "справа налево".
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #568 (permalink)  
Старый 22.06.2015, 10:18
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Как вставить код скрипта, вместе с тегами script в шаблон, чтобы парсер не ругался?

cdata, data, ругается, мол ошибка. Почему?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #569 (permalink)  
Старый 22.06.2015, 10:30
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Оо, нашёл. Честно говоря решётку не заметил, думал это коммент, автоматом воспринимаю в конфигах...

#{cdata}

А тогда такой вопрос, а зачем тут решётка? Был хитрый план по на будущее?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 22.06.2015 в 10:33.
Ответить с цитированием
  #570 (permalink)  
Старый 22.06.2015, 23:30
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
Как вставить код скрипта, вместе с тегами script в шаблон, чтобы парсер не ругался?
Для этой задачи в SS существует расширенный синтаксис: https://github.com/kobezzza/Snakeski...%D0%B8%D 1%81

Логика простая: когда ты начинаешь юзать #{...} для декларации директивы, то все вложенные директивы также будут требовать такую декларацию, например:

{template foo()}
  #{script}
    var a = {
      bar: #{1 + 2}
    };
  #{/}
{/}


Цитата:
data
Эта директива для inline вставок, например,

{template foo()}
  <input type="button" onclick="{data console.log({foo: 1})}">
{/}


Цитата:
А тогда такой вопрос, а зачем тут решётка? Был хитрый план по на будущее?
CDATA работает до построения AST, чисто вырезается по регулярке и поэтому я сделал обязательным расширенный синтаксис директивы для использования, чтобы случайно не выстрелить себе в ногу.

Цитата:
Оо, нашёл. Честно говоря решётку не заметил, думал это коммент, автоматом воспринимаю в конфигах...
В SS комменты обозначаются через

/// Однострочный коммент
/* Многострочный коммент */
/** JSDoc (не вырезается парсером из конечного кода) */


Для создания XML комментариев есть удобная директива comment, которая также поддерживает условия для старых ИЕ.

{template foo()}
  {comment IE 7}
    {link}http://bar.com/ie.css{/link}
  {/}
{/}


Но также можно просто писать по старинке

PS: По поводу однострочных комментов: есть сильное желание заменить в SS7 на //# (или ещё как), т.к. сейчас можно напороться на ошибку при подключение некоторых урлов:

<a href="file:///C://foo.png">121</a>


Т.е. нужно явно экранировать:

<a href="file://\/C://foo.png">121</a>


Забавно, что я сделал коммент как /// чтобы не напарываться на такие ошибки с //, но не учёл, что урлы с тремя слешами тоже бывают
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 22.06.2015 в 23:55.
Ответить с цитированием
Ответ



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

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


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