Ответы пользователя по тегу Angular
  • А как подставлять переменную в директиву?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    функция отрабатывает до compile директивы, так что значения еще не интерполированы. Что вы можете сделать, так это воспользоваться директивой ng-include.

    return {
        template: '<ng-include src="templateUrl"></ng-include>',
        scope: {},
        link: function (scope, el, attr) {
            attr.templateUrl.$observe(); // логика изменения переменной.
        }
    }
    Ответ написан
    2 комментария
  • Нужно ли делать фильтр для коллекции в Angular?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    но тогда у полозователя не будет возможности сделать что-то самому


    Я уже вам написал в комментариях к другому вопросу но продублирую. Когда пользователь выбирает какой-то другой вариант сортировки или фильтрации, мы просто уведомляем контроллер об этом. Тот уже будет просить сервисы что бы тот предоставил данные согласно нашим новым условиям. Сервис все это сделает и вернет нам данные в контроллер. Мы чуть чуть может еще подготовим данные под наше представление и выплюнем во view (по сути данные попадают в $scope). Далее за счет дата биндинга view реагирует на изменение состояния данных и подстраивается под них согласно вашему описанию (все эти ng-repeat и т.д. Не спроста шаблоны в ангуляре называют декларативными).

    Это собвенно и есть MVC, при таком подходе нашему view будет глубоко плевать на реализацию фильтрации, а нашей модели (логике по работе с данными) плевать на то как эти данные выводятся. А контроллер будет лишь посредником который будет знать как эти два слоя связываются друг с дружкой.

    updated

    Решил сделать пример, на который буду ссылаться дальше:

    Пример

    А теперь немного поясню зачем вообще так загоняться и когда допустимо фильтровать все в контроллере или вообще во вью, что бы небыло недопонимания.

    Давайте представим что мы мысленно раздели наше приложение на два слоя: слой который работает с данными (M), и слой который занимается отображением этих данных пользователю (V), ну и посовместительству хэндлит взаимодействие пользователя с этим view (формы например).

    Что бы упростить поддержку системы, нам надо снизить связанность этих двух слоев, сделав их максимально независимыми. Что бы изменения в одном слое не вызывали особой необходимости менять что-то в другом. Для этого мы вводим промежуточный слой - контроллеры (С). Это по сути и есть основная идея MVC. Разделяй и властвуй.

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

    Если у вас работа с данными уже была разделена сделать это не составит проблем. Мы просто поменяем наш ProductCatalog и заменим там методы на нужные нам. View от этого не поменяется ни сколички. Более того мы можем спокойно покрыть этот функционал быстрыми юнит тестами.

    Но есть еще такая штука как "технический долг". Это когда нам надо запилить этот самый фильр в первый раз, к вам подходит клиент или менеджер и говорит "нет времеин объяснять нужно срочно еще позавчера". И у нас тут выбор:
    - спорить с заказчиком о том что надо делать все правильно
    - плюнуть и сделать максимально быструю реализацию, таким образом взяв у нашего кода "взаймы". То есть все работает но в будущем нам этот долг придется вернуть. Мол решили мы потом перенести фильтрацию на сервер и времени на это уйдет уже больше, так как когда-то мы сэкономили на разработке.

    Словом, нужно соблюдать баланс. Иногда такие решения более чем оправданы.

    Но вернемся к реалиям anuglar-а. Дело в том что когда вы используете фильтры в шаблонах, они будут дергаться на КАЖДЫЙ $digest цикл, так работает дата биндинг. То есть при относительно небольшом объеме данных у нас приложение уже будет жутко педалить. Потому использовать фильтры с коллекциями в шаблонах простительно только если вы на 100% уверены что данных пока будет мало, а потом можно будет переделать.

    Как-то так. Поскольку у вас есть возможность использовать ангуляровские фильтры внутри сервисов или контроллеров, "экономный" вариант будет занимать не больше времени разработки и поддерживать такой код будет проще.
    Ответ написан
    8 комментариев
  • Как работают простые фильтры в Ангуляре?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    оба делают только одну половину работы, а как обьеденить не знаю

    Сделайте нужную вам коллекцию в контроллере, а лучше в сервисе. Прекратите использовать фильтры для коллекций. Да можно, но только для очень простых случаев и только для того что бы быстро сделать на коленке.
    Ответ написан
    3 комментария
  • Что такое рецепты и провайдеры в angular.js?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что за рецепты создания обьектов?

    Подозреваю что речь идет о фабриках. Сожгите эту книгу (или что вы там читали).

    Если да, то что посоветуете вкурить?

    Википедию и учите JS.

    По поводу всяких там фабрик и т.д.... Я как-то делал пример - вся разница тут. Ну и да, еще есть две фазы - конфигурация и запуск, константы допустим доступны везде, провайдеры только на этапе конфигурации, фабрики вообще не доступны - доступно только то что они генерят....
    Ответ написан
    Комментировать
  • Почему на отрабатывает $watch в директиве?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    скаляры в скоупах не наследуются, так как передаются по значению. Варианты, хранить данные в объекте, они передаются по ссылке а ссылки наследуются.
    Ответ написан
  • Как правильно связать Angularjs и Symfony2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вопрос как правильно подключить angularjs и использовать его в роли front-end.

    не подключать, пусть будет как отдельное приложение которое будет общаться с апишкой по HTTP (Restfull, JSON RPC, как хотите).
    Ответ написан
    Комментировать
  • JavaScript фреймворк для Symfony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Пробовал использовать Angular.js, но он синтаксисом конфликтует с twig-ом

    можно изменить синтаксис как в ангуляре (через $compileProvider) так и в симфони. Так же товаристч Mikhail Osher верно подметил. Ну и да, нечего хранить шаблоны ангуляра в шаблонах твига. Держите их отдельно, а данные можно через модуль-пустышку передавать.

    В целом же Angular лучше себя показывает в контексте SPA, когда на симфони у вас исключительно апишка (собственно я так и делаю). Правда с Angular2 уже можно спокойно жить. Еще как вариант, если вас интересует именно UI фреймворк, то как уже говорили выше - React или Polymer.
    Ответ написан
    Комментировать
  • В чем проблема контроллера?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    разберитесь с замыканиями в вашем этом кофескрипте. Они неявно возвращают значения, насколько я помню.

    Вы в ангуларе регистрируете не контроллер, а конструктор контроллера. А конструкторы в js могут вернуть все что угодно, если вы явно делаете return.

    Что бы понять что пошло не так - загляните в сгенерированный код. Я уверен там будет что-то в духе:

    return self.icons = localData.icons.
    Ответ написан
  • Как улучшить контроллеры?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Может что то лишнее, что не должно быть в контроллере


    1) никаких скоупов в контроллерах, используйте controller as синтаксис.
    2) дробите все на директивы, старайтесь делать так, что бы все приложение состояло из директив, или отдельных компонентов.
    3) именуйте методы контроллера... логичнее...
    4) устраните дублирование кода, у вас там масса весьма однообразного кода.
    5) вынесите работу с данными в сервисы.
    6) используйте классы (es6 или coffee)
    Ответ написан
    3 комментария
  • Почему неправильно работает ng-click?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    ну вы передаете строку, получаете строку... где проблема?

    вы наверное хотели сделать так:

    img(
        src="images/control/settings.svg",
        ng-click="showSettings($event, 'money', data.img, data.name)"
    ).change
    Ответ написан
  • Как создать новый экземпляр сервиса (Service) при инициализации директивы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    который должен (по документации) создавать свой экземпляр конструктора:

    вы не дочитали документацию. $injector делает это ровно один раз, вы можете его попросить сделать это еще раз, но если у вас возникает такая нужда значит вы что-то делаете не так. В целом все сервисы в ангуляре инстанцируются в единственном экземпляре.
    Ответ написан
    4 комментария
  • Как по ng-mouseenter вывести шаблон кастомной директивы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    ng-include
    Ответ написан
    Комментировать
  • Нужен ли Angular JS Java разработчику?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    если учить Angular JS то у меня есть на него около 3 месяцев.

    Тогда первый вариант, нанять человека.
    Ответ написан
    Комментировать
  • Почему поведение service отличается от поведения функции конструктора этого service?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Из вашего вопроса ничерта не понятно, приведите код и по каким признакам вы определяете что что-то не так?

    По вашей задаче: инверсия зависимости и фабрики.
    Ответ написан
    23 комментария
  • Почему ui-router не посылает событий при первом входе?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    stateChangeStart запускается при смене стейта и только. Просто обрабатывайте внутри директивы и рефреште по stateChangeStart
    Ответ написан
    3 комментария
  • Как преобразовать json в модель/класс?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    JSON.parse

    А вообще попросите там на сервере что бы вам правильный Content-type возвращало, и тогда ангуляр будет это делать сам. Либо же почитайте про interceptors

    Если же задача состоит в "замэпить данные на объект". то...

    return data.map((item) => Post.fromObject(item));
    Ответ написан
    Комментировать
  • Что такое angularjs-ui-bootstrap?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    This repository contains a set of native AngularJS directives based on Bootstrap's markup and CSS. As a result no dependency on jQuery or Bootstrap's JavaScript is required. The only required dependencies are:


    Панели, баттон групы это только CSS, а тут конкретно js компоненты из bootstrap реализованные исключительно на angularjs, без зависимости от jquery.

    Angular Material это одна из реализаций material design под angular.
    Ответ написан
    8 комментариев
  • Как получить модель в директиве?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Эти данные должны быть распарсены в директиве чтобы собрать динамическое меню.

    они должны быть распаршены в сервисе, то есть в вашей модели. А затем уже это дерево или что еще в контроллере может быть приведено к формату view.

    Каким образом модель должна попасть в директиву?


    class FooController {
        constructor(fooService) {
            this.fooService = fooService;
        }
    }
    
    return {
        controller: FooController,
        controllerAs: 'vm',
        link: function (scope, el, attr, ctrl) {
             
        }
    }


    либо заинджектить сервис в директиву.
    Ответ написан
    5 комментариев