我对Jasmine很新。我阅读了一个包含以下代码的教程:
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();然后我假设范围变成一个全新的空范围,并且范围上没有showData方法,那么scope.showData()如何工作?我认为$ controller只能帮助实例化一个新的HomeCtrl,但它没有分配给任何变量(我希望看到像var homeCtrl = $controller('HomeCtrl', {$scope: scope});
之类的东西)我不确定它是否与范围变量有关情况?
一些注释:我制作一些console.log来查看范围变量:
scope = $rootScope.$new();
console.log("scope before",scope)
$controller('HomeCtrl', {
$scope: scope
});
console.log("scope after",scope)
我可以看到现在"之后的"范围内有showData,所以$ controller已经修改了原始范围变量。我不确定为什么,并认为这种方式不直观。
答案 0 :(得分:0)
$ controller service负责实例化控制器。 https://docs.angularjs.org/api/ng/service/ $控制器
在第一个代码示例中,您创建了控制器,它需要$ scope作为依赖项,并将函数showData创建为$ scope属性。
在之前创建每个新的空范围并调用下一个$ controller服务 - 这意味着 创建我' HomeCtrl' instance和$ scope参数由作用域传递(在前一行创建的新空作用域)
在控制器实例化中,调用控制器构造函数,将方法showData添加为$ scope属性。
顺便说一句,更好的解决方案是使用controllerAs语法,因为那时控制器是标准的JS构造函数,其方法就是这个而不是$ scope(例如this.showData)