Фильтруй правильно, или вредные советы по фильтрации в Angular.Js

в 6:24, , рубрики: AngularJS, filters will love you, javascript, optimization, Блог компании Инфопульс Украина, вредные советы, вычислю по айпи, ОЧЕНЬ вредные советы., пятница, разработка, Разработка веб-сайтов, юмор

Фильтруй правильно, или вредные советы по фильтрации в Angular.Js - 1

Всем привет. Эта статья писалась довольно долго, пару раз переписывалась заново, и, в итоге, меня не устроила. Уж слишком менторский получался тон. А тут, вдруг, грядет пятница, конец спринта, и значит, можно расслабиться. И так, не воспринимайте слишком серьезно, всего лишь несколько советов о том, как готовить фильтры в Angular.JS

Кому интересно или хочется немного расслабиться — вперед под кат и всем хорошей пятницы!

1. Используйте фильтры всегда и везде. Для заголовков страницы, названий колонок, списка товаров. Фильтры выполняются каждый дайджест, а значит, пользователь точно ничего упустит. Чем больше фильтров на странице – тем лучше. К тому же, потом, в каждый фильтр вы сможете добавить логики.

2. Делайте фильтры универсальными. Фильтр должен уметь фильтровать все. От товаров до embedded base-64. Всего один фильтр, каких-то двадцать параметров и ваша команда счастлива. Ведь все работает «из коробки», и писать ничего не надо. А если этот фильтр умеет еще и текст переводить в нижний регистр, то признание вас найдет. Неизбежно.

3. Всегда добавляйте в ваш фильтр логгирование. Так отлаживать намного проще. И, поверьте на слово, тот, кто будет разбирать ваши логи, точно не останется без работы.

4. Давайте фильтрам только общие названия. А вдруг его кто-то потом сделает универсальным! Не переименовывать же потом! К тому же так вашим коллегам будет гораздо интереснее читать разметку. Можно сказать, квест им подарите. Бесплатный.

5. Infinitie Scroll должен быть реализован только на фильтрах и никакой подгрузки данных. Сходили на сервер, выгрузили всю таблицу, а дальше пусть наши фильтры трудятся. Не зря же вы их писали. Нагрузка на сервер меньше, хостинг можно взять подешевле, а вам «благодарочка».

6. Бизнес логика должна быть только в фильтрах. Потому что – «И» — Инкапсуляция.

7. Вообще прячьте в фильтры всю логику. Так надежнее. А если не получается, то хотя бы самую «тяжелую». И чем тяжелее, тем лучше. Можно там всякие сложные расчеты производить или DOM менять. А еще лучше сервер дергать. Прямо из фильтра. Пользователь не поезд, подождет! Зато у вас будут самые тонкие сервисы и контроллеры. Как раз похвастаетесь на следующем собеседовании.

8. Кстати о DOM. Кто сказал, что для манипуляций с ним нужно использовать директивы? Фильтры, это лучшее место для $('#user_icon').trigger('click');

9. Коммуницируйте фильтры. Пусть один фильтр, что-то меняет во втором фильтре. Лучше всего через $broadcast. И лучше всего входящие данные. Так дебаг превратиться в веселую и занимательную игру, развивающую внимание, концентрацию и знание основ ядра Angular. И вообще, всегда используйте $broadcast. Это стильно.

10. Собирайте фильтры в цепочки! Если в цепочке меньше трех фильтров это не кошерно! Можно даже предложения фильтрами писать. Для коллег или просто любопытных пользователей.

11. Комбинируйте фильтры с ng-mouse-over. Это весело! Можно даже в хендлере mouse-over ничего не писать. Главное повесьте его на body и зачекиньте в пятницу вечером. Особенное удовольствие получите, если у вас Continues Integration.

12. Не оптимизируйте. Во-первых, ранняя оптимизация убивает. Во-вторых, это работа фреймворка. Вы же не будете делать чужую работу, правильно?

И главное, знайте. Не фильтры тормозят ваше приложение. А непонимание и недооценка Вас, как разработчика!

Для любопытных.

Фильтры в Angular это такая функция, которая вызывается каждый дайджест. Т.е. часто, очень часто, и несколько раз подряд. Контроля над началом фильтрации нет, контроля над окончанием нет. Поднимать события бесполезно и чревато. При неосторожном обращении легко превращает приложение в тыкву. А, да, «из коробки» инструментов для оптимизации фильтров тоже нет.

Для более любопытных.

Победить это не просто и каждый находит свое решение для конкретного случая. Например фильтрацией на стороне, использование ng-change, isDirty, INotifyOnPropertyChange, кешированием, $scope.$watch(function getData(){}, true) и так далее. Хотя последнее я вам не советую ибо это может быть даже хуже. Еще говорят CodeReview помогает, но это вообще шаманство.

Для самых любопытных.

.directive('onRepeatFinish', [function () {
            return {
                restrict: 'A',
                link: function (scope, elem, attr) {
                    if (scope.$last === true) {
                            console.log('ngRepeatFinished');
                    };
                }
            }
        }]);

Если что, вот «это» для параметризованных фильтров не работает.

Всем хорошей пятницы.

Автор: Инфопульс Украина

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js