Как я могу вызвать некоторую директиву из контроллера после успешного выполнения ajax-запроса?
Например, если у меня есть функция:
function successAjax()
{
call directive
}
и если у меня есть в шаблоне:
<directive></directive>
должно появиться:
<p>success</p>
У вас есть несколько вариантов пойти так, как вы хотите. Если бы я был тобой, я бы вместо переехать ваш 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>
Вам следует создать другой сервис, для которого вы установите значение, чтобы уведомить, что запрос был выполнен. Затем в вашей директиве вы будете следить за переменной в этой службе и отображать сообщение в шаблоне вашей директивы с ng-if
Во-первых, я не чувствую необходимости показывать сообщение об успехе после вызова ajax с использованием директивы.
Angularjs использует службу $ q для обработки вызовов http и возврата объекта обещания и обработки этого в вашем контроллере, после чего вы можете привязать сообщение об успешном завершении к вашему представлению из области видимости контроллера.
Если вы хотите запустить директиву из контроллера, вы можете использовать $ broadcast, чтобы отправить событие всему $ rootScope и обработать его в вашей директиве.
Пример:
$rootScope.$broadcast('myFunction',{});
В директиве:
scope.$on('myFunction',function(event, data){
// Do what ever you want to do
});
Надеюсь, это поможет вам. Благодарю.