ls.blog = (function ($) {
this.toggleJoin = function(obj, idBlog){
var params = {idBlog: idBlog};
var url = '...';
ls.hook.marker('toggleJoinBefore');
ls.ajax(url,params,function(result) {
ls.hook.run('ls_blog_toggle_join_after',[idBlog,result],obj);
});
};
});
Как это предлагается делать в новой парадигме:
ls.blog = (function ($) {
this.toggleJoin = function(obj, idBlog){
var context = this.toggleJoin;
context.params = {idBlog: idBlog};
context.url = '...';
$('body').trigger('toggleJoinBefore.alto.blog', context);
ls.ajax(context.url, context.params, function(result) {
context.result = result;
$('body').trigger('toggleJoinAfter.alto.blog', context);
});
};
});
И вот как можно обрабатывать эти события в сторонних плагинах:
$('body').on('toggleJoinBefore.alto.blog', function(event, context){
context.params.otherParam = 123; // добавляем еще один параметр
});
/* ... */
$('body').on('toggleJoinAfter.alto.blog', function(event, context){
if (context.result.bStateError) {
// анализируем и обрабатываем результат
}
});
Т.е. в функцию-обработчик события вторым параметром передается объект-контекст функции, в которой вызываются эти события, и мы можем в обработчике иметь доступ к любым свойствам контекста.Плюсы нового подхода очевидны: избавляемся от самопальных «костылей» (и лишнего кода) и переходим к стандартным механизмам обработки событий. Возможно, есть какие-то недостатки, но я пока их не заметил.
6 комментариев
1. Сейчас весь js-функционал заключен в объект ls, который построен не по архитектуре плагинов jQuery. (Очень хороший топик по теме)
2. Объекты, входящие в состав частично не соответствуют jslint. Не обязательно, конечно, ему следовать, но все же… (http://habrahabr.ru/post/74419/)
3. Все объекты «ls.» подгружается полностью, и все его методы доступны на любой странице даже если они не используются. Я понимаю, что модульность в js это отдельная тема, но подгружать все скрипты, даже если они не нужны, тоже не стоит, imho. (Как вариант requirejs.ru/)
4. Нет системы используемых в коде js идентификаторов и классов кода html шаблонов.
Думаю, что стоит обратить внимание не только на триггеры, но и на общую архитектуру js-кода в Alto.
Про JSLint помню. По большому счету, соглашения JSLint должны быть составной частью Alto Coding Style. А так же составной частью должны стать правила (кроме php и js) еще и для css и tpl.
Объект ls сейчас — неймспейс для большого набора функций. Нужно ли это оформлять, как jQuery-плагины? Честно говоря, не даже думал об этом, поэтому пока не могу ни согласиться, ни возразить. Если есть какие-то аргументы «за», то рад буду услышать.
Модульность js-скриптов — да, отдельная тема. Собственно, еще в ЛС был заложен механизм, позволяющий группировать js- и css-файлы в разных комбинациях и загружать на разных страницах разные наборы. Но как-то особо не прижилось пока. Рассуждая чисто теоретически, трудно сказать, какой подход лучше — сформировать один набор, который будет грузиться на всех страницах, либо делать разные наборы. В первом случае можем получить выигрыш за счет кеширования, во втором — за счет уменьшения размера наборов. Где выигрыш будет больше — это только эксперименты могут показать.
Но даже если оставлять, как есть (т.е. единый набор), то часть скриптов, бесспорно, имеет смысл вынести в «ленивую загрузку», напр., скрипты, связанные с редактированием — сам редактор, загрузка фото и аватар и т.д.
Я считаю, что нужно — это, во первых, понизит «уровень вхождения» в код новых разработчиков. Во вторых, однообразит подход к разработке. В третьих, упростит читаемость кода…
Я очень не уверен, что можно получить какие-то плюсы за счет манипуляций с кэшем и наборами скриптов. Модульный подход я рассматриваю как инструмент развития, который позволит построить более сложную систему в будущем.