如何在angularjs中的指令中推迟方法执行

时间:2013-11-06 17:17:11

标签: angularjs angularjs-directive

我正在编写一个将函数作为参数重新编写的指令,该指令执行并运行函数中包含的任何内容。

用例是:

  • 该指令包含一个链接
  • 当用户单击链接时,执行作为参数传递的方法(来自控制器)
  • 当用户点击单击按钮时,微调器将显示
  • 当方法执行完成时,微调器将隐藏

我的问题是如何推迟执行并将其绑定到promise,以便在方法执行后隐藏微调器。

为了便于说明,我使用了 $ timeout 从3到1的数量,请查看我到目前为止所做的代码:

app.directive('toogleTextLink', function($compile,$q) {
    return {
        restrict: 'AE',
        scope: { callback: "&targetMethod" },
        template: '<div><a style="cursor: pointer" ><b>{{text}}</b></a>show value= {{show}}  <br/><div ng-class="{previewLoader: show}"></div></div>',
        link: function (scope, element, attr) {
            scope.value = attr.value;
            scope.show = false;
            scope.$watch('value', function () {
                    if (scope.value) {
                        scope.text = "yes";
                    } else {
                        scope.text = "no";
                    }
            });
            element.bind('click', function () {
                scope.show = true;
                scope.value = !scope.value;
                scope.$digest();
                if (scope.callback) {
                    var deferred = $q.defer(scope.callback());
                    deferred.promise.then(function () {
                        scope.show = false;
                        console.log("then called");
                    });

                }

            });
        }
    };
});

  app.controller('myCtrl', function($scope,$timeout,$q) {
  $scope.IsFacebookConnected = false;
  $scope.countDown = 3;
  $scope.authSocial = function(value, socialNetwork) {
        switch (socialNetwork) {
            case "facebook":
                $scope.IsFacebookConnected = !value;
        }

         runCounter = function() {
             $scope.countDown -= 1;            
            if ( $scope.countDown > 0)        
                $timeout(runCounter, 1000); 
                console.log("timer");
        };
        runCounter();
    };

});

这也是plunker

1 个答案:

答案 0 :(得分:2)

安迪·乔斯林(Andy Joslin)写了一个“承诺跟踪器”,它完全符合你的需要。甚至还有一些用于$ http整合的糖。基本上你向它添加“promises”,它会告诉你执行状态。然后,您可以将该执行状态绑定到ng-show上,例如加载微调器动画。 https://github.com/ajoslin/angular-promise-tracker这是一个演示:http://plnkr.co/edit/3uAe0NdXLz1lCYlhpaMp?p=preview

您的代码将类似于:

$scope.tracker = promiseTracker("socialtracker");
$scope.tracker.addPromise(somePromise);

在你看来:

<div ng-show="tracker.active()">Loading...</div>