не отрабатывает $http() при вызове из директивы через click
Добрый день, недавно открыла для себя фрэймворк AngularJS решила сделать простенькую операцию и натолкнулась на проблему:
есть кнопка: <a href="" id="vdsvdsvdsvd" class="button_submit btn_gray_red" send-user-information-to-server method-from-controller="send_authentication_data_User">Войти</a> есть директива: questApp.directive('sendUserInformationToServer', function() { return{ scope: { methodFromController: '=', }, link: function(scope, elm, attrs, ctrl) { var ElementButton = angular.element(elm); ElementButton.bind('click', call_the_controller_to_request); function call_the_controller_to_request(){ console.log(scope.methodFromController(elm)); } } } }); создала контроллер: questApp.controller('AuthController', function AuthController($scope, $http){ $scope.contentQuestions = "Сюда будет подгружаться результат запроса"; $scope.send_authentication_data_User = function(elem){ var message = "строка"; $http({method: 'GET', url: 'static/testFilesJson/question_Auth.json', data:"message=" + message, headers: {'Content-Type': 'application/x-www-form-urlencoded'}}). success(function(data, status, headers, config) { alert(12); $scope.contentQuestions = data; /*console.log($scope.contentQuestions.author);*/ console.log(data.ResultsForEachField[0].PassData); }). error(function(data, status, headers, config) { alert(22); console.log(status); }); } }); суть проблемы: НЕ отрабатывает сервис $http() при таком вызове. Он рабоатет если я напрямую вызову метод контроллера из самого элемента через ng-click, он работает и из директивы если я вызову метод контроллера вот так: angular.$apply(ElementButton.bind('click', call_the_controller_to_request()));только тогда он отрабатывает при загрузке а не при клике, но категорически не хочет работать в том контексте который я показала. Помогите пожалуйста, мучаюсь второй день уже |
А если позаимствовать из того же ngClick? (для вызова метода необходимо указать контроллер, иначе как определить в какой области видимости его искать?)
<a href="" id="vdsvdsvdsvd" class="button_submit btn_gray_red" send-user-information-to-server ng-controller="AuthController" method-from-controller="send_authentication_data_User(elem)">Войти</a> questApp.directive('sendUserInformationToServer', function($parse) { return{ compile: function($element, attr) { var fn = $parse(attr['methodFromController']); return function(scope, element, attr) { element.on('click', function(event) { scope.$apply(function() { fn(scope, {elem:element}); }); }); }; } } }); http://plnkr.co/edit/oiT5yLhX7RSy1IeQ49Bs?p=preview |
из ngClick все работает. Но, если я правильно понимаю суть философии AngularJS то у них не рекомендуется в контроллерах производить никаких манипуляций с DOM и кроме того по их задумке (опять же если я правильно понимаю) директива знает об элементе вызвавшем его, а контроллеру это ни к чему, а мне как раз нужно добиться следующего:
1) через добавление нового атрибута подключить к этому HTML-элементу директиву, затем по клику 2) в директиве произвести необходимые манипуляции с DOM 3) затем сделать Ajax запрос (который я как раз хотела сделать в контроллере) 4) затем результат запроса вернуть в директиву а в ней опять же на основе полученных результатов и запроса, до-завершить манипуляции с DOM. Ваш пример я попробую реализовать, просто сейчас работаю не с рабочего компьютера где все исходники и выполнение этой задачи пока отложила. |
Да, "ангулярщики", рекомендуют манипулировать с DOMом через директивы. А директивы, в свою очередь, имеют мощный инструментарий работы как с областями видимости, так и с внешними сервисами необходимыми для получения отображаемых данных.
Т.е. через директивы мы указываем как отображать, а что отображать уже решают контроллеры(сервисы). Соответственно контроллерам "наплевать", как будут отображаться данные. В Вашем случае, возможно стоит посмотреть в сторону создания отдельного сервиса, с которыми будет взаимодействовать и контроллер и директива. А promises этого сервиса помогут качественно организовать работу с Ajax и в директиве и в контроллере. |
спасибо за совет) я попробую
|
Часовой пояс GMT +3, время: 19:14. |