1

在这个来自Angular 文档的指令单元测试示例中:

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) 在 it 函数的元素变量声明中做了什么吗?

我不确定它有什么作用。

4

3 回答 3

1

Angular 中的编译分两步完成。$compile(template)只做前半部分,其中指令通常只是转换 DOM(以及其他更复杂的事情;)),并返回一个“链接函数”。第二部分是在使用特定范围作为参数调用链接函数时完成的。在这部分,指令可以编辑作用域、链接行为到 DOM 事件等。更多可以在官方指南中找到。

于 2014-11-21T10:34:03.363 回答
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" */
于 2014-11-21T10:21:29.920 回答
1

它用于强制$digest循环,以便立即编译和渲染其上方的元素,而不是等待未确定的$digest循环

于 2014-11-21T10:14:13.907 回答