当我使用“controller as”语法并使用$compile
实例化控制器时,我试图找出控制器对象的确切发布位置。这是我的测试:
describe('"Controller as" syntax', function() {
it('should work when controller is instantiated via $compile', function() {
var $injector = angular.injector(['ng', function($controllerProvider) {
$controllerProvider.register('DummyController', function() {
this.message = 'hello there';
});
}]);
var $compile = $injector.get('$compile');
var $rootScope = $injector.get('$rootScope');
var $scope = $rootScope.$new();
var view = $compile(
'<div ng-controller="DummyController as dummy">{{dummy.message}}</div>'
)($scope);
$rootScope.$apply();
// OK - The view is updated
expect(view.text()).toBe('hello there');
// FAIL - 'dummy' is not available on the $scope
expect($scope.dummy.message).toBe('hello there');
});
});
请看最后的期望。我希望通过dummy
可以使用$scope
,但它似乎并不存在。我错了,不应该像这样工作吗?
我还发现它可以通过$scope.$$childTail
和$scope.$$childHead
获得:
// OK - 'dummy' is available here
expect($scope.$$childTail.dummy.message).toBe('hello there');
// OK - 'dummy' is available here
expect($scope.$$childHead.dummy.message).toBe('hello there');
这是否意味着在我的案例中创建了子范围,并且dummy
仅在该子范围上发布?
答案 0 :(得分:0)
范围
如果设置为 true ,则会为此指令创建新范围。
var ngControllerDirective = [function() {
return {
restrict: 'A',
scope: true,
controller: '@',
priority: 500
};
}];
所以,这是预期的,我的期望是错误的。获取dummy
属性的唯一方法是通过那些不属于公共API的$$...
内容。