2014-11-21 4 views
1

В этом примере модульного тестирования директива от Angular docs:

describe('Unit testing great quotes', function() { 
    var $compile; 
    var $rootScope; 

    // Load the myApp module, which contains the directive 
    beforeEach(module('myApp')); 

    // Store references to $rootScope and $compile 
    // so they are available to all tests in this describe block 
    beforeEach(inject(function(_$compile_, _$rootScope_){ 
     // The injector unwraps the underscores (_) from around the parameter names when matching 
     $compile = _$compile_; 
     $rootScope = _$rootScope_; 
    })); 

    it('Replaces the element with the appropriate content', function() { 
     // Compile a piece of HTML containing the directive 
     var element = $compile("<a-great-eye></a-great-eye>")($rootScope); 
     // fire all the watches, so the scope expression {{1 + 1}} will be evaluated 
     $rootScope.$digest(); 
     // Check that the compiled element contains the templated content 
     expect(element.html()).toContain("lidless, wreathed in flame, 2 times"); 
    }); 
}); 

Может кто-то объяснить, что ($ rootScope) делает в элементе объявления переменной в функции его.

Я не уверен, какой эффект у него есть.

ответ

1

Он используется, чтобы заставить $digest цикл так, чтобы элемент над ней собран и оказываемыми немедленно, вместо того, чтобы ждать в течение неопределенного $digest цикла

+1

Если бы я получал ошибку 'TypeError: undefined is not function 'на этой строке, что могло бы вызвать ее? – Daft

1

$compile функция создает функцию, которая захватывает значения из переменной области действия для завершения привязок.

Когда вы вызываете функцию, созданную $compile с переменной области видимости, она заменяет все привязки значением в области, предоставленной вами в качестве аргумента, и создаёт элемент DOM.

Например:

$rootScope.age = 15; 
$scope.age = 52; 

var element = $compile("<div>Tom is {{age}}</div>")($rootScope); 
/* element is a div with text "Tom is 15" */ 

var element2 = $compile("<div>Tom is {{age}}</div>")($scope); 
/* element2 is a div with text "Tom is 52" */ 
1

Компиляция в угловому делается в два этапа. $compile(template) делает только первую половину, где директивы обычно просто преобразуют DOM (и другие, более сложные вещи также происходят;)), и возвращает «функцию связывания». Вторая часть выполняется, когда функция связывания вызывается с определенной областью как аргумент. В этой части директивы могут редактировать область действия, поведение ссылок в событиях DOM и т. Д. Подробнее можно найти в official guide.

Смежные вопросы