'this'总是指向模板中的当前范围吗?

时间:2015-01-19 16:27:36

标签: javascript angularjs angularjs-scope

是否始终安全在模板中使用this来获取当前范围的参考?

<span ng-click="log(this)">
    Is my onclick parameter always the current controllers scope?
</span>

这是一个显示我的意思的fiddle

也可以搜索一下,但在文档中找不到任何意义。它似乎有效,但我不想依赖于未记录的功能。如果可以,请为此链接正确的文档

2 个答案:

答案 0 :(得分:4)

表达式log(this)是根据范围进行评估的,scope对象中也包含this属性,它指向自己的引用。因此,它将根据范围评估this将产生范围本身。例如,您也可以传递$parent并且您将看到它将指向父作用域,因为表达式中的参数针对当前作用域进行评估将产生scope['$parent']类似于它发生在范围['1'} ]也是。 在角度上下文中使用ng-click="method(this)"与在DOM元素上执行onclick="somefunc(this)"完全不同。 Angular只能扩展它,因为它有一个名为this的属性附加到范围对象。

另一件事是你不需要传递this,否则方法是通过对范围对象进行评估来运行的,所以引用它将产生范围本身。即你也可以做ng-click="log()",在日志方法中你可以将this称为元素绑定的当前范围。例如,如果您使用controllerAs语法并且正在调用:

<div ng-controller="MyOtherCtrl as vm">
    <span ng-click="vm.log(this)">Click on me, if background gets teal, then this points on the child controllers scope</span>
</div>

现在this将不是控制器实例(这是您通常所期望的那样),而是它只是scope对象本身,因为它将表达式计算为{{1 }}

在控制器的上下文中使用scope.vm.log(scope.this)总是更安全,除非您特别想要引用由于某些指令而在视图上创建的某些子作用域(通过某些ng-repeat,ng-if等。)包装特定的上下文。还要记住,在子作用域中,属性会被原型继承(除了孤立的作用域指令)。

据我所知,没有记录链接或任何内容,但源代码本身就是官方记录。 Angular使用$scope来扩展表达式,如果你看到source code,你可以看到angular用$parse调用带有上下文的表达式。

答案 1 :(得分:2)

this指的是控制器指令的$ scope。

例如:

<div ng-controller="myCntrl">
   <span ng-click="log(this)">
      Is my onclick parameter always the current controllers scope?
   </span>
</div>

因此,this指的是myCntrl的$范围。