Ответы пользователя по тегу Angular
  • Angular: Как вызвать свою директиву привязанную к классу после выполнения ng-class?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Увы никак (адекватным способом во всяком случае). Вам нужно придумать другой способ активации директивы.
    Ответ написан
    Комментировать
  • Как правильно работать с html5mode и node.js?

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    angular.module('app')
    .directive('myDirective', function () {
        return function (scope, el, attr) {
            scope.$watch('variable', function (text) {
                  console.log('$scope.variable = %s', text);
            }
        }
    });


    а еще лучше воспользоваться изолированными скоупами. Если вам нужно просто вывести количество символов - проще будет это сделать фильтрами.
    Ответ написан
    3 комментария
  • Как скрыть некоторые ключи объекта при ngRepeat?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    либо делать ng-repeat по тем ключам, которые отображать следует и обращаться к объекту, либо через ngIf скипать элементы с ключами в black list. А еще лучше - фильтровать ключи при записи в скоуп.
    Ответ написан
    Комментировать
  • Как оценить стоимость проекта на angular js?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я с ангуляром не знаком, только jquery

    Может стоит отказаться или предупредить клиента? Либо предупредите что добавится еще месяцок что бы вы разобрались с ангуляром. Там работы не мало, скажем так. Если вы в бой сразу ломанетесь не разобравшись толком, в конце получится неподдерживаемый кусок гуано. Как я понимаю опыта с SPA до этого у вас так же небыло.

    А так оценивайте как обычно и умножайте на три а то и на четыре.
    Ответ написан
  • [Angular.js] Multi view в angular 1.3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Насколько я помню, что-то типа ui-router будет только в angular 2.0

    Если вам интересно что будте, можете ознакомиться:
    https://docs.google.com/document/d/1I3UC0RrgCh9CKr...
    Ответ написан
    Комментировать
  • Почему не работает ng-click?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ебушки воробушки... А теперь посмотрите на мой вариант, взгляните на свою реализацию, и скажите как лучше.

    angular.module('productStore', [])
    
    .factory('productRepository', function ($http) {
        var dataResolve = function(promise) {
             return promise.then(function(response) {
                  return response.data;
             }
        }
       
        return {
            getProducts: function (category) {
                category = category || '';
                return dataResolver($http.get('/api/productservice/' + category));
            },
            addToCart: function (id) {
                return dataResolver($http.post('/api/cartservice/add/' + id));
            },
            getTotalPrice: function (callback) {
                return dataResolver($http.get('/api/cartservice/'));
            }
        }
    })
    
    .controller('ProductController', function ($http, productRepository) {
    
        var updateTotalPrice = angular.bind(this, function() {
             return productRepository.getTotalPrice.then(angular.bind(this, function(result) {
                   this.totalPrice = result;
             }));
        });
        updateTotalPrice();
    
        productRepository.getProducts(category).then(angular.bind(this, function(results) {
            this.products = results;
        });
    
        this.addToCart = function(id) {
            productRepository.addToCart(id).then(function() {
                   updateTotalPrice();
            };
        }
    });


    Используйте промисы, не используйте эти стремные штуки с this. У вас есть .bind нативный и angular.bind.

    в частности меня вводит в ступор следующее:
    var ProductController = new productStore.controller


    Если вы методы этого контроллера используете где-то еще, то самое время подумать о том что бы вынести все это добро в сервис.
    Ответ написан
    1 комментарий
  • Как работать из Angular с HTTP Batch запросами для ASP.NET WebApi 2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    return $q.all([promise1, promise2, promise3])

    + посмотрите готовые решения
    Ответ написан
    Комментировать
  • AngularJS Frontend Решения?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    доступ к апишке инкапсулирован обычно в сервис/сервисы. Не нравится что отдают бэкэндщики - воспользуйтесь DTO, оберните все в свои объекты и работайте как хотите. Пока апишка не готова - можно временно захардкодить какие-то данные.

    И да, не понятно зачем вам вообще что-то бэкэндщикам отдавать. SPA есть отдельное приложение. Если бэкэндщики хотят сделать деплоймент - то исходники им имхо полезнее, можно при сборке тесты прогонять (вы же их пишите, да?) ну и все в таком духе.

    Проблемы обычно от отсутствия взаимодействия между отделами в рамках одного проекта, когда вы не вкурсе что собираются делать другие, и другие не вкурсе что собираетесь делать вы и что вам для этого нужно.
    Ответ написан
    Комментировать
  • Как в angular обратится к динамично созданому елементу?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ух... включаю режим телепата.

    У вас предположим есть такой код:

    angular.module('app', [])
    
    .directive('foo', function () {
        return function (scope, el, attr) {
            el.append('<div bar></div>');
        }
    }
    .directive('bar', function () {
        return function (scope, el, attr) {
            console.log('init bar directive');
        }  
    });


    есть такой шаблон
    <div ng-app="app">
        <div foo></div>
    </div>


    И при запуске приложения мы в консольке не видим нашего консоль лога и расстраиваемся.

    А почему так? а потому что angular не отслеживает появление/удаления новых элементов сам по себе, и не пытается на каждый чих искать директивы. Для этого его нужно попросить собрать директиву.

    angular.directive('foo', function ($compile) {
        return function (scope, el, attr) {
            var child = $compile('<div bar></div>')(scope);
            el.append(child);
        }
    });


    Если вам нужно при инициализации директивы это добро делать, проще вынести в template директивы и тогда angular все сам будет делать, так как он внутри всеравно будет делать $compile.

    Подробнее тут: https://docs.angularjs.org/api/ng/service/$compile
    Ответ написан
    Комментировать
  • AngularJS - как правильно организовать запросы в разных контроллерах и директивах?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    нет. это не правильно. как минимум инджектить сервис $http в контроллеры это уже сомнительное решение а то что делаете вы это совсем плохо. У вас есть метод run модуля, у вас есть контроллеры... зачем это выносить в темплейты? Это не их зона ответственности.

    ng-init задумывался как хелпер для ngRepeat, использовать его для чего-то другого не рекомендуется.
    Ответ написан
    Комментировать
  • Как исправить ошибку рендера в angularjs при использовании директив?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Потому что не запускается цикл $digest. Почитайте что ли как работает data-binding в angularjs.

    Если кратко - на каждое асинхронное изменение $scope нужно запускать $digest или $apply. Разница такая: $digest запускает обновление только текущего и дочерних скоупов. $apply обновляет все все все. посему в таких штуках лучше использовать $apply.

    element.bind('click', function(){
            scope.$apply(function () {
               radiogroupCtrl.check(scope);
            });
    });
    Ответ написан
    Комментировать
  • Как скрыть элемент после вставки в body?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    .directive('location', function () {
                        return {
                            restrict : 'A',
                            scope    : {},
                            replace  : true,
                            templateUrl : 'part.html',
                            link     : function (scope, element, attr) {
                              element.hide();
                            }
                        }
                    })

    так мол нельзя?

    Вообще проследите логику:
    - берем элемент DIV и вешаем на нее директиву
    - компилим элемент
    - вставляем в DOM и скрываем
    - angular удаляет элемент и заменяет его шаблоном (с задержкой так как выполняется ajax запрос за шаблоном).

    так как у нас нету возможности даже определить момент времени, когда происходит замена извне директивы, мы не может взять так просто и скрыть элемент. Развечто так, но сами понимаете, это отстой.

    body.append(directive);
    setTimeout(function () {
         body.find('[data-location], [location]').hide();
    }, 250);


    Решение, отказаться от replace, вставить template вручную и отказаться от templateUrl.
    Ответ написан
    5 комментариев
  • Что такое jsonp и как им пользоваться?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    JSONP - это кастыль, используемый в данный момент только за счет такой штуки как IE, который до 10-ой версии не поддерживает CORS.

    Проблема состоит в том что политикой безопасности браузера не разрешается делать кросдоменные XHR запросы (тобиш AJAX в простонародьи). Учитывая что angular-based (да и воообще любое приложение на клиенте) приложения должны получать данные с REST API, и это API может находиться на другом сервере, то вполне логично что нужно придумать какой-то способ получать эти данные и что бы это можно было делать не взирая на ограничения браузера.

    Нормальные ребята для нормальных браузеров придумали и используют CORS (Cross-origin resource sharing), который стандартизирован, хорошо и няшно работает и легко прикручивается к проекту. Но если у вас заявлена поддержка IE9 или более старых версий, то там все это работать не будет и приходится опять ваять кастыли с jsonp.
    Ответ написан
    Комментировать
  • Как сделать предзагрузку моделей для AngularJS?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    А причем тут директива ng-init? В приведенном вами же примере нету вообще ничего такого.

    Данные не должны быть храниться в шаблоне, ну тоесть в атрибутах в виде текста, что бы пришлось потом руками парсить. Если вы внимательно посмотрите на то, что будет на выходе приведенного вами примера, то увидите следующее:

    Допустим наша коллекция будет иметь вид
    [{id: 1, username: 'foo'}, {id: 2, username: 'bar'}];

    тогда пользователю придет следующий шматок html:
    <script>
      var accounts = new Backbone.Collection;
      accounts.reset([{id: 1, username: 'foo'}, {id: 2, username: 'bar'}]);
    </script>


    следовательно никакого парсинга руками backbone не производит.

    Что можно сделать в angular. Можно объявить модуль-константу, которую будет использовать основное приложение. Если переделать приведенный вами же пример выйдет так:
    <script>
    angular.module('prefetchedData', [])
        .constant('users', <%= @accounts.to_json %>)
        .constant('projects', <%= @projects.to_json(:collaborators => true) %>);
    </script>

    В основном приложении уже можно инджектить эти данные куда вам нужно. и обрабатывать при той же инициализации. У этого способа есть свои недостатки, в частности ваше приложение начинает зависит от какого-то модуля prefetchedData, но зато мы избавляемся от необходимости делать эти данные глобальными, что даже лучше чем в случае с backbone где для этого надо было лепить кастыль, ну и опять же разруливать эти данные можно напрямую в сервисах, что так же удобно.
    Ответ написан
  • Как в angular распределить обработку данных в контроллерах?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нужно больше информации о функционале форм и результатов поиска. В целом можно сделать сервис-посредник, который будет заниматься хранением и обработкой фильтров, и выдавать данные для другого контроллера.
    Ответ написан
  • Как сделать оффлайн копию страницы веб-приложения?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    кеширующий http-proxy какой нужно. Что бы ответы от апишки сохранял. Если приложение ваше - кэш на клиенте.
    Ответ написан
  • Как отслеживать изменения в Angular для jQuery?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Директивы. Напишите директиву которая подключает тултипы и все будет хорошо. Вообще любые манипуляции в DOM стоит делать через директивы и только.
    Ответ написан
  • Можно ли в Angular повесить событие на все инпуты?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    angular.module('app')
    .directive('ngBlurDelegate', function ($parse) {
        return {
            restrict: 'A',
            link: function (scope, el, attr) {
                 var callback = $parse(attr.ngBlurDelegate);
                 el.on('blur', function () {
                      //.. тут что-то делать
                      callback(scope);
                 });
            }
        }
    });

    <form ng-blur-delegate="callback()">
    ...
    </form>


    Что-то в этом духе.
    Ответ написан
    Комментировать