angular.js中的动态服务注入

时间:2015-07-04 06:30:37

标签: javascript angularjs node.js dependency-injection

我使用Angular.js Services在控制器之间共享一些数据,如下所示:

var mainApp = angular.module("mainApp", []);
mainApp.service('CalcService', function(){
        this.square = function(a) { 
            //do something
         }
});

mainApp.controller('CalcController', function($scope, CalcService) {
      $scope.square = function() {
          $scope.result = CalcService.square($scope.number);
      }
});

它可以工作,但正如您所看到的,在控制器中,我必须注入CalcService并在我的控制器中使用它。我的问题是,我有很多服务,在我的应用程序的某些页面中,我需要注入服务依赖,在某些页面我不需要!如果我在那里写,在我不需要的页面中,我得到错误,因为我的控制器在另一个文件中,我没有加载它。我怎么能克服这个?

我希望我能在某些情况下设置注射。我需要一个If Else声明。这可能吗?

我的应用程序结构是这样的:我有一个主应用程序和一些可以附加到页面的小部件,但每个页面有不同的小部件,然后我需要在我的主模块中注入适当的小部件服务。我有一个主模块和一个主控制器,以及其他控制器内的许多服务。每个页面都有自己的小部件和控制器。在主控制器中,我必须看到哪些小部件出现然后注入其服务

1 个答案:

答案 0 :(得分:0)

只有在需要服务时才能注射。

这是您注册服务的控制器

mainApp.controller('CalcController',['$scope','CalcService',function($scope, CalcService) {
      $scope.square = function() {
          $scope.result = CalcService.square($scope.number);
      }
}]);

这是您没有注入服务的控制器

mainApp.controller('Calc2Controller',['$scope',function($scope) {
          $scope.square = function(n) {
              $scope.result = n * n;
          }
    }]);

编辑1

看起来您在相同的文件中拥有服务和控制器。这有点不对劲。

您可以看到服务全局共享数据或封装可以重用的逻辑。控制器专注于特定模板。

我建议您使用此结构分离您的服务和控制器。

App--
   -components
   -features
          - login
                -loginController.js
                -login.html
   -services
          - userService.js
          - loginService.js
   -libs
          - bootstrap.js
          - lodash.js

由于您的服务现在是独立的,您可以与任何控制器共享它们。您可以选择使用一种服务的位置和不使用的服务。