Как вызвать директиву из функции контроллера [AngularJS]

Как я могу вызвать некоторую директиву из контроллера после успешного выполнения ajax-запроса?

Например, если у меня есть функция:

function successAjax()
{
call directive
}

и если у меня есть в шаблоне:

<directive></directive>

должно появиться:

<p>success</p>

0

Решение

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

angular.module('app').directive('directive', [
'$http',
function($http) {
return {
link: link,
scope: {}
};

function link(scope, elem, attrs) {
scope.doAjax = doAjax;

function doAjax() {
$http.get('url').then(function() {
elem.append('<p>success</p>');
});
}
}
}
]);

Если вы абсолютно иметь чтобы иметь вызов AJAX в вашем контроллере, вы можете использовать события, но вы должны позаботиться о них, так как они засорят цикл дайджеста:

// Controller
function doAjax() {
$http.get('url').then(function() {
$scope.$broadcast('some.event.descriptor');
});
}

// Directive
function link(scope, elem, attrs) {
scope.$on('some.event.descriptor', function() {
elem.append('<p>success</p>');
});
}

Другой вариант — привязать некоторые данные из контроллера к вашей директиве:

// Controller
$scope.someData = '';
$http.get('url').then(function() {
$scope.someData = 'success';
});

<!-- Controller Template -->
<directive data-something="someData"></directive>

// Directive
function() {
return {
scope: {
something: '='
}
};
}

<!-- Directive Template -->
<p>{{ something }}</p>
2

Другие решения

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

0

Во-первых, я не чувствую необходимости показывать сообщение об успехе после вызова ajax с использованием директивы.
Angularjs использует службу $ q для обработки вызовов http и возврата объекта обещания и обработки этого в вашем контроллере, после чего вы можете привязать сообщение об успешном завершении к вашему представлению из области видимости контроллера.

Если вы хотите запустить директиву из контроллера, вы можете использовать $ broadcast, чтобы отправить событие всему $ rootScope и обработать его в вашей директиве.

Пример:

$rootScope.$broadcast('myFunction',{});

В директиве:

scope.$on('myFunction',function(event, data){
// Do what ever you want to do
});

Надеюсь, это поможет вам. Благодарю.

-1