如何从控制器函数调用指令[AngularJS]

时间:2016-02-10 21:22:43

标签: php angularjs angularjs-directive

成功ajax请求后如何从Controller调用某些指令?

例如,如果我有功能:

function successAjax()
{
   call directive
}

如果我有模板:

<directive></directive>

应该出现:

<p>success</p>

3 个答案:

答案 0 :(得分:2)

您可以选择自己想要的方式。如果我是你,我会将你的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>

答案 1 :(得分:0)

您应该创建另一个服务,您将在其上设置一个值以通知请求已完成。然后在您的指令中,您将监视该服务中的变量,并在ng-if

指令的模板中显示该消息

答案 2 :(得分:-1)

首先,在使用指令调用ajax后,我觉得不需要显示成功消息。 Angularjs使用$ q服务来处理http调用并返回promise对象并在控制器中处理它,之后您可以将成功消息从控制器范围绑定到您的视图。

如果你想从控制器触发指令,你可以使用$ broadcast将事件发送到整个$ rootScope并在你的指令中处理它。

示例:

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

指令:

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

这对您有所帮助。感谢。