“this”是否始终指向模板中的当前范围

Does 'this' always point on the current scope in a template?

本文关键字:范围 this 是否      更新时间:2023-09-26

模板中使用this来获取当前范围的引用是否总是安全的

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

这里有一个小提琴来说明我的意思。

也搜索了一下,但在文档中找不到任何要点。它似乎有效,但是我不想依赖未记录的功能。如果可以,请为此链接适当的文档

表达式

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

另一件事是你不需要传递this否则该方法是通过针对 scope 对象进行评估来运行的,因此引用这将产生范围本身。 即您也可以执行ng-click="log()",在 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对象本身,因为它将表达式计算为scope.vm.log(scope.this)

在控制器的上下文中使用$scope总是更安全,除非您特别想要引用由于某些指令(通过某些 ng-repeat、ng-if 等)包装该特定上下文而在视图上创建的某些子作用域。还要记住,属性在子作用域中以原型方式继承(独立作用域指令除外)。

据我所知,没有任何链接记录或任何东西,但源代码本身是官方记录。Angular 使用$parse来扩展表达式,如果您看到源代码,您可以看到 angular 调用表达式function.apply上下文。

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

例如:

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

所以,this指的是myCntrl的$scope。