如何从服务激活微调指令

时间:2019-03-15 17:24:27

标签: angularjs angularjs-directive angularjs-service

如何在AngularJS服务中使用AngularJS指令?

在AngularJS 1.5应用程序中,我有一条指令在视图中心显示一个微调器。我希望能够通过服务激活此微调器。

因此,例如,该服务可以注入到控制器中,并且每当调用该服务时,它将触发微调框显示在屏幕上。

如何将该指令注入服务?

目前,在我所看到的任何地方,我只能找到有关如何将服务注入指令的指令,而不能找到相反的方式

2 个答案:

答案 0 :(得分:2)

方法是使用$rootScope/$scope event总线:

 app.service("dataService", function($rootScope, $http) {
     this.get = function() {
         $rootScope.$broadcast("dataService.Start");
         return $http.get(url).finally(function() {
             $rootScope.$broadcast("dataService.Done");
         });
     };
 })

在指令中:

 app.directive("spinner", function() {
     return {
         link: postLink,
     };
     function postLink(scope, elem, attrs) {
         scope.$on("dataService.Start", function (event) {
             elem[0].startSpinner();
         });
         scope.$on("dataService.Done", function (event) {
             elem[0].stopSpinner();
         });
     }
});

有关更多信息,请参见AngularJS Developer Guide - Scope Event Propagation

答案 1 :(得分:0)

您可以安装angular-spinner 然后将文件包含在index.html中 并为您的应用添加依赖项:

var myapp = angular.module('myapp', ['angularSpinner']);

然后,您可以使用自定义指令拦截所有http请求,而无需在每个http调用之前添加开始,而在之后(更少的代码)之后停止

app.directive('usSpinner', ['$http', '$rootScope', function ($http, $rootScope) {
  return {
    link: function (scope, elm, attrs) {
      $rootScope.spinnerActive = false;
      scope.isLoading = function () {
        return $http.pendingRequests.length > 0;
      };

      scope.$watch(scope.isLoading, function (loading) {
        $rootScope.spinnerActive = loading;
        if (loading) {
          elm.removeClass('ng-hide');
        } else {
          elm.addClass('ng-hide');
        }
      });
    }
  };

}

然后在您的html中将其添加到正文:

<span us-spinner></span>