Почему у этого есть $ rootcope. $ New()?
Я исследую, как использовать Жасмин с Кармой. Я пытаюсь ввести область в свой контроллер, и откуда-то я взял этот код...
var scope = { message: 'hello' };
beforeEach(angular.mock.module('myApp'));
beforeEach(angular.mock.inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
$controller('myController', { $scope: scope });
}));
Проблема заключается в том, что область обрывается линией...
scope = $rootScope.$new();
Поэтому я могу прокомментировать это, но мне интересно, для чего нужна эта линия? Когда я хочу называть $rootscope.$new()
? Я понимаю, что это связано с изоляцией, но я не получаю практических приложений.
ОБНОВЛЕНИЕ: Как указывает Тим ниже, это проблема, потому что я объявил свою собственную область. Поэтому я могу изменить код, чтобы быть....
var scope;
beforeEach(angular.mock.module('myApp'));
beforeEach(angular.mock.inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
scope.message = 'hello';
$controller('myController', { $scope: scope });
}));
И это работает больше, чем ожидалось, но мне все еще интересно, какой лучший подход? Что такое $rootscope.$new()
даже для?
Ответы
Ответ 1
$rootScope.$new
создает новый экземпляр $rootScope.Scope
который наследуется от $rootScope
. Другими словами, он создает новую $rootScope
область $rootScope
.
Причина, по которой вы можете использовать его в тестах (например, вы опубликовали), заключается в том, что ваша другая альтернатива - использовать $rootScope
. Это может создать беспорядок, поскольку он может использоваться повсеместно.
Я считаю лучшей практикой создавать (и уничтожать впоследствии) новую область для каждого тестового примера.
Здесь ваш пример переписан на то, что я считаю лучшей практикой:
describe('myModule', function() {
var $rootScope;
beforeEach(module('myModule'));
beforeEach(function() {
inject(function(_$rootScope_) {
$rootScope = _$rootScope_;
});
});
describe('myController', function() {
var $scope;
beforeEach(function createChildScopeForTheTest() {
$scope = $rootScope.$new();
});
afterEach(function disposeOfCreatedChildScope() {
$scope.$destroy();
});
it('tests something', function() {
$scope.message = 'hello';
$controller('myController', { $scope: $scope });
expect($scope.something).toEqual('world');
});
});
});
Ответ 2
Области в угловом $rootScope
вложенные в родительские отношения с $rootScope
, все из которых $rootScope
на одном родительском $rootScope
Это то, как угловой создает $scope
который вводится в ваш контроллер, поэтому он создает тот же опыт, когда вы тестируете ваш контроллер.
Это особенно полезно, если вы делаете что-либо в своем контроллере, для чего вам нужно называть $ apply, а не вам издеваться над этим.