Не нашёл в wiki, у snakeskin есть callback из скрипта, а ля Snakeskin(tpl, callback) или что-то типа Snakeskin.compile.then? Чтобы вызывался после активации DOM в шаблоне. callback в шаблоне не понял что делает.
Сейчас использую Snakeskin.hash[tplName] для рендеринга шаблона в DOM, так подключать нормально? в wiki тоже не нашёл описания про это. Использую es6, про это тоже в вики немногословно. Скомпиленные шаблоны подключены в header> menu.ss.js ... и т.д. Если я что-то не нашёл, то просьба ткнуть носом или пояснить. |
Не совсем понял, что ты хочешь сделать. Ты имеешь ввиду, можно ли, чтобы результат шаблона отдавался по колбеку, а не сразу?
Цитата:
foo.ss
{template foo()}
Hello World!
{/}
index.js console.log(foo()); // Hello World! Если не хочется писать в глобалспейс, то просто добавляем шаблону неймспейс, например tpls.foo Цитата:
{void foo(...args)}
|
Цитата:
Типа как тут:
insertTplIntoDOM('menu').then(function(){
//плавно скрываем первый элемент и уже точно известно, что элемент примонтирован и к нему есть доступ.
});
//где 'menu' это Snakeskin.hash['menu']
В принципе у меня обертка есть, я просто подумал, может есть из коробки. Или меня уже глючит и все вставляемые элементы уже доступны мгновенно после innerHTML=tpl? Цитата:
а в скрипте Snakeskin.hash[tplName] - тут получаем доступ к шаблону Цитата:
{template tpls.foo()}
Hello World!
{/}
Как вообще не писать в глобал? Snakeskin.hash[tplName] - это разве не локал? |
Цитата:
Цитата:
https://github.com/SnakeskinTpl/Snak...world.ss.js#L6 Вот тут можно глянуть код после компиляции и увидеть логику. Цитата:
Цитата:
{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()}
{/}
Цитата:
Ещё можно просто обернуть полученный JS код функций и задать нужный this. Для таких задач удобно использовать конвеер сборки gulp/grunt с плагином wrap. PS: отмечу, что в SS7 весь этот механизм значительно улучшен, например появилась поддержка runtime модулей и можно явно задать тип экспорта шаблонов.
{@= export 'es6'}
{import { getUserData } from './myLib.js'}
{template foo() @async}
{forEach await getUserData() => @el}
{@name} - {@age}
{/}
{/}
|
Цитата:
|
Одна из важнейших фич 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('}');
}
);
Как вам? |
Цитата:
Я пока из ss6 использую 40% и ума не приложу зачем мне больше, поэтому вряд ли буду полезен. Для меня главное дока и предсказуемое поведение, в остальном пиши хоть "справа налево". |
Как вставить код скрипта, вместе с тегами script в шаблон, чтобы парсер не ругался?
cdata, data, ругается, мол ошибка. Почему? |
Оо, нашёл. Честно говоря решётку не заметил, думал это коммент, автоматом воспринимаю в конфигах...
#{cdata} А тогда такой вопрос, а зачем тут решётка? Был хитрый план по на будущее? :) |
Цитата:
Логика простая: когда ты начинаешь юзать #{...} для декларации директивы, то все вложенные директивы также будут требовать такую декларацию, например:
{template foo()}
#{script}
var a = {
bar: #{1 + 2}
};
#{/}
{/}
Цитата:
{template foo()}
<input type="button" onclick="{data console.log({foo: 1})}">
{/}
Цитата:
Цитата:
/// Однострочный коммент /* Многострочный коммент */ /** 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> Забавно, что я сделал коммент как /// чтобы не напарываться на такие ошибки с //, но не учёл, что урлы с тремя слешами тоже бывают :( |
| Часовой пояс GMT +3, время: 21:01. |