模板中使用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。