角度注射器上下划线的含义

时间:2013-07-31 23:28:42

标签: angularjs dependency-injection jasmine angularjs-scope angular-template

我一直在为一些Angular组件编写测试,使用我刚才在google上找到的语法:

 describe('Directive: myDir', function () {
     beforeEach(module('myApp'));
     beforeEach(module('app/views/my_template.html'));
     beforeEach(inject(function ($rootScope, _$compile_, $templateCache) {
         $templateCache.put('views/my_template.html', $templateCache.get('app/views/my_template.html'));

         var scope, $compile;
         scope = $rootScope;
         $compile = _$compile_;
         element = angular.element("<div my-dir class='my-dir'></div>");
     }));

     it('does things', function () {
         $compile(element)(scope);
         scope.$digest();
     });
 });

我的问题是关于注射_$compile_的具体问题。它与$compile有何不同?我为什么要这样做呢?为什么$ compile被重新定义,为什么我不能简单地用$ compile注入?

1 个答案:

答案 0 :(得分:12)

来自Angular official tutorial(测试部分):

  

注入器忽略前导和尾部下划线(即 $ httpBackend )。这允许我们注入服务,但然后将其附加到与服务同名的变量。

在您的示例中,您可以将变量$compile重命名为compile,然后从参数名称中删除下划线。事实上,你这样做scope所以$rootScope仍然没有下划线。

我个人喜欢在我的测试中保留Angular内置服务的名称,以便在浏览代码时轻松发现它们。