是否始终安全在模板中使用this
来获取当前范围的参考?
<span ng-click="log(this)">
Is my onclick parameter always the current controllers scope?
</span>
这是一个显示我的意思的fiddle。
也可以搜索一下,但在文档中找不到任何意义。它似乎有效,但我不想依赖于未记录的功能。如果可以,请为此链接正确的文档。
答案 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
的$范围。