有人可以为AngularJS中的$ controller服务提供一个用例吗?

时间:2015-01-09 18:11:01

标签: angularjs angularjs-service

Angularjs docs将$ controller服务的用法表示为: $controller(constructor, locals);

任何人都可以关注这两点:

  1. 何时使用 $ controller 服务。请提供一些用例。
  2. 传递给它的'locals'参数的详细信息。

3 个答案:

答案 0 :(得分:14)

您可以创建要在$ scope上执行的公共函数到一个控制器中,可以命名为'CommonCtrl'

angular.module('app',[]).controller('CommonCtrl', ['$scope', function($scope){
      var self = this;
      $scope.stuff1 = function(){

      }

      $scope.stuff2 = function(){

      }
      self.doCommonStuff = function(){
               // common stuff here
               $scope.stuff1();
               $scope.stuff2();

      };
      return self;
}]);

然后将此控制器注入其他控制器,让我们说“TestCtrl1'像

angular.module('app',[]).controller('TestCtrl1', ['$scope','$controller', function($scope, $controller){
        var commonCtrl = $controller('CommonCtrl',{$scope: $scope}); // passing current scope to commmon controller
        commonCtrl.doCommonStuff();
}]);

这里,在$ controller service的第二个参数中,我们传递了CommonCtrl所需的依赖项。因此doCommonStuff方法将使用TestCtrl1控制器的范围。

答案 1 :(得分:3)

简而言之,它在单元测试期间创建目标控制器很有用。

假设您有一个带有签名.controller('MainCtrl', function($scope, serviceA){..})的控制器。

在测试中,

// ...

beforeEach(inject(function ($rootScope, $controller, serviceA) {

  // assign injected values to test module variables
  scope = $rootScope.$new();
  service = serviceA

  // create the controller, by passing test module variables values as dependencies
  $controller('MainCtrl', {'$scope': scope, 'serviceA': service});
}));

it('test on controller', function() {
  //...
});

了解详情:https://docs.angularjs.org/guide/unit-testing

答案 2 :(得分:0)

您还可以使用此服务来实现控制器继承。

angular.module('app',[]).controller('BaseCtrl', ['$scope', function($scope){
  $scope.action1 = function(){
    console.log('In BaseCtrl action1');
  }

  $scope.action2 = function(){
    console.log('In BaseCtrl action2');
  }

}]);

angular.module('app').controller('ChildCtrl', ['$scope', function($scope){

  angular.extend(this, $controller('BaseCtrl', {
      $scope: $scope
  }));

  $scope.action1 = function(){
    console.log('Overridden in ChildCtrl action1');
  }

  $scope.action2 = function(){
    console.log('Overridden in ChildCtrl action2');
  }

}]);