Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   не отрабатывает $http() при вызове из директивы через click (https://javascript.ru/forum/angular/44378-ne-otrabatyvaet-%24http-pri-vyzove-iz-direktivy-cherez-click.html)

attary 17.01.2014 14:33

не отрабатывает $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()));
только тогда он отрабатывает при загрузке а не при клике, но категорически не хочет работать в том контексте который я показала. Помогите пожалуйста, мучаюсь второй день уже

dolpheen 17.01.2014 23:16

А если позаимствовать из того же 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

attary 21.01.2014 18:55

из ngClick все работает. Но, если я правильно понимаю суть философии AngularJS то у них не рекомендуется в контроллерах производить никаких манипуляций с DOM и кроме того по их задумке (опять же если я правильно понимаю) директива знает об элементе вызвавшем его, а контроллеру это ни к чему, а мне как раз нужно добиться следующего:

1) через добавление нового атрибута подключить к этому HTML-элементу директиву, затем по клику
2) в директиве произвести необходимые манипуляции с DOM
3) затем сделать Ajax запрос (который я как раз хотела сделать в контроллере)
4) затем результат запроса вернуть в директиву а в ней опять же на основе полученных результатов и запроса, до-завершить манипуляции с DOM.

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

dolpheen 21.01.2014 20:46

Да, "ангулярщики", рекомендуют манипулировать с DOMом через директивы. А директивы, в свою очередь, имеют мощный инструментарий работы как с областями видимости, так и с внешними сервисами необходимыми для получения отображаемых данных.
Т.е. через директивы мы указываем как отображать, а что отображать уже решают контроллеры(сервисы). Соответственно контроллерам "наплевать", как будут отображаться данные.
В Вашем случае, возможно стоит посмотреть в сторону создания отдельного сервиса, с которыми будет взаимодействовать и контроллер и директива. А promises этого сервиса помогут качественно организовать работу с Ajax и в директиве и в контроллере.

attary 24.01.2014 13:57

спасибо за совет) я попробую


Часовой пояс GMT +3, время: 17:12.