Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 了解Jasmine测试中的$controller_Angularjs_Jasmine - Fatal编程技术网

Angularjs 了解Jasmine测试中的$controller

Angularjs 了解Jasmine测试中的$controller,angularjs,jasmine,Angularjs,Jasmine,我是茉莉花的新亲戚。我阅读了一篇包含以下代码的教程: angular.module('moduleX', []).controller('HomeCtrl',function($scope) { $scope.showData = function(data) { $scope.$broadcast('showData', data); }; }); 以下是测试: beforeEach(inject(function ($rootScope, $controller) {

我是茉莉花的新亲戚。我阅读了一篇包含以下代码的教程:

angular.module('moduleX', []).controller('HomeCtrl',function($scope) {
  $scope.showData = function(data) {
    $scope.$broadcast('showData', data);
  };
});
以下是测试:

beforeEach(inject(function ($rootScope, $controller) {
   scope = $rootScope.$new();
   $controller('HomeCtrl', {
      $scope: scope
   });
   spyOn(scope, '$broadcast');
}));

it('should call $broadcast', function() {
    scope.showData();
    expect(scope.$broadcast).toHaveBeenCalled();
});
我的问题是,一切是如何运作的?if scope=$rootScope.$new();然后我假设scope变成了一个全新的空scope,并且scope上没有showData方法,那么scope.showData()如何工作呢?我认为$controller只帮助实例化一个新的HomeCtrl,但它没有分配给任何变量(我希望看到类似于
var HomeCtrl=$controller('HomeCtrl',{$scope:scope});
),我不确定在这种情况下它是否与scope变量有关


一些注意事项:我制作了一些console.log来查看scope变量:

  scope = $rootScope.$new();
  console.log("scope before",scope)
  $controller('HomeCtrl', {
    $scope: scope
  });
  console.log("scope after",scope)
我可以看到现在在“scope after”中有showData,所以$controller已经修改了原来的scope变量。我不知道为什么,我认为这样做有点不直观

$controller服务负责实例化控制器。 $controller

在第一个代码示例中,您创建了控制器,它需要$scope作为依赖项,并创建函数showData作为$scope属性

在before中,每个新的空作用域被创建,下一个$controller服务被调用——这意味着 创建我的“HomeCtrl”实例,并通过作用域传递$scope参数(在前一行创建的新空作用域)

在控制器实例化中调用控制器构造函数,它将方法showData添加为$scope属性

顺便说一句,更好的解决方案是使用controllerAs语法,因为controller是标准的JS构造函数,其方法不是$scope(例如this.showData)

$controller服务负责实例化控制器。 $controller

在第一个代码示例中,您创建了控制器,它需要$scope作为依赖项,并创建函数showData作为$scope属性

在before中,每个新的空作用域被创建,下一个$controller服务被调用——这意味着 创建我的“HomeCtrl”实例,并通过作用域传递$scope参数(在前一行创建的新空作用域)

在控制器实例化中调用控制器构造函数,它将方法showData添加为$scope属性

顺便说一句,更好的解决方案是使用controllerAs语法,因为controller是标准的JS构造函数,其方法不是$scope(例如this.showData)