angularjs phonecat教程第5步

时间:2014-10-22 18:18:49

标签: javascript angularjs

我正在阅读angularjs phonecat教程。我目前正在使用step 5

在"测试"部分中,我发现了这段代码:

describe('PhoneCat controllers', function() {

describe('PhoneListCtrl', function(){
  var scope, ctrl, $httpBackend;

  // Load our app module definition before each test.
  beforeEach(module('phonecatApp'));

  // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_).
  // This allows us to inject a service but then attach it to a variable
  // with the same name as the service in order to avoid a name conflict.
  beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) {
    $httpBackend = _$httpBackend_;
    $httpBackend.expectGET('phones/phones.json').
        respond([{name: 'Nexus S'}, {name: 'Motorola DROID'}]);

    scope = $rootScope.$new();
    ctrl = $controller('PhoneListCtrl', {$scope: scope});
  }));

我无法理解创建 $ httpBackend var的原因。你能解释一下吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

稍后需要在所有$httpBackend测试定义中访问

it。因此,它必须在it调用的父关闭中,您将在下面写下来。

beforeEach是您执行适用于所有it次调用的内容的地方,因此初始化$httpBackend是一个明智的地方。

关于上面的评论,如果inject的参数命名为$httpBackend,那么在该匿名函数中,您将无法访问" global"一个(关于JavaScript中的闭包如何工作),所以你将无法初始化它。 因此,写inject的人添加了这个"魔法"有关前导和尾部下划线的功能,因此您可以将其命名为与内部初始化所需的全局变量不同。

I'd recommend reading this to better understand closures.