Почему у этого есть $ 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, а не вам издеваться над этим.