检查属性是否附加到$ scope

时间:2014-10-17 08:39:36

标签: javascript angularjs

这个问题实际上包含两个:

1 - 函数是否在javasript中创建自己的$ scope?

e.g.$scope.foo = function() {
    $scope.bar = "Bar";    
}

我问这个,因为在我试图运行的一个这样的测试中,我检查以确定范围上是否存在变量,运行一个函数然后重新检查:

 iit('getPatientFirstName should attach patientName to the scope', function() {
    // Passes
    expect(scope.patientName).toBeUndefined();
    spyOn(scope,'getPatientFirstName').andCallThrough();
    scope.getPatientFirstName(detailsBody);

    // Fails
    expect(scope.patientName)not.toBeUndefined();
});

 // In the controller
 $scope.getPatientFirstName = function (dataBody) {
        $scope.patientName = dataBody.patientFirstName;
 };

所以这表明他们可能有自己的范围?如果是这种情况,我们可以测试一下吗?

2 - 只是使用函数外部的对象是一个有效的替代方法:

 $scope.patientDetails = {
        patientName: ''
 };

 $scope.getPatientFirstName = function (dataBody) {
        $scope.patientDetails.patientName = dataBody.patientFirstName;
 };

由于

修改 考虑到这两个答案引发了另一个问题 - 如果一个变量(属性或对象)附加到$ scope,它是否被认为是全局的?它可以在该控制器的任何功能中访问,但只要在一个完全不同的控制器中调用 - 是的,它可以吗?

确认/拒绝任何人?

看来,将变量分配给$ scope global会被认为对我的测试有效。

2 个答案:

答案 0 :(得分:1)

我会回答这个问题的方式与你拿到它的方式略有不同。我希望它可以帮助你重新思考你的状态。

1 - 函数是否在javasript中创建自己的$ scope? 他们确实创造了自己的范围。但是在范围内也可以使用周围的范围。因此,当您在函数内编写函数时,内部函数可以使用外部函数的所有变量

实施例

function foo() {
  var a=5;
  function bar() {
    var b=4;
  }
  function hello() {
    var c=3;
  }
}

a适用于所有功能,foo,bar和hello b不适用于foo或hello。 c不适用于foo或bar。

2 - 只是使用函数外部的对象是一个有效的替代方法: 所以,你应该尝试创建一个外部函数;在那里你可以声明将严格包含在该外部函数中的变量。 您在此外部函数中创建的任何函数都可以使用该外部作用域。

如果可能,应避免使用全局变量。


一个例子:jQuery。

jQuery有一个全局变量:var jQuery(你也可以通过别名$访问它)。 jQuery使用的变量不会与您使用的任何变量冲突。 你想从jQuery中获得任何东西,你将不得不通过$(或jQuery)

答案 1 :(得分:1)

关于您的第一个问题,没有,函数不会自己创建新的$scopes(请注意,我们正在讨论的是范围而不是闭包,这是两个不同的概念)。

在您的示例中,$scope.foo函数在定义bar的同一$scope对象上创建新的foo属性。最终的$scope对象看起来像这样:

$scope {
  foo: function() {
    $scope.bar = "Bar";    
  },
  bar: "Bar"
}

您的测试问题可能与.之前遗失的not有关。

expect(scope.patientName).not.toBeUndefined();
  

是一种有效的替代方法,只是为了使用存在于外部的对象   功能:

,您可以使用在函数外部定义的对象。

如果对象位于同一个$scope对象上,则没有任何问题,只需确保在运行该函数之前已定义,否则您将获得{{1}错误。