什么是作用域
在dagger.js中,作用域特指指令表达式中回调参数“$scope”所指向的对象。
根作用域
根作用域是由框架所创建和维护的顶层作用域对象。根作用域对象中只包括路由对象$router和验证器函数$validator。
如果某条指令的宿主元素及其上层元素的指令从未创建过作用域,那么该指令表达式中的“$scope”将指向根作用域。
参考如下示例:
自定义作用域
由指令创建出的作用域称为自定义作用域,创建出自定义作用域的指令称为该作用域的源指令。
如果在某条指令的宿主元素或其上层元素的指令中创建过自定义作用域,那么该指令表达式中的“$scope”将指向其最近层级元素上的源指令所创建出的作用域对象。
如何销毁作用域
自定义作用域对象在其源指令的宿主元素被销毁时自动销毁。根作用域在页面的生存期内永远不会被销毁。
作用域的工作方式
dagger.js作用域的工作方式与原生javaScript作用域非常接近。请记住如下几个规则:
2. 高层级宿主元素上声明的指令无法访问其子层级宿主元素的源指令创建出的自定义作用域。
3. 低层级源指令上创建的作用域对象继承自高层级源指令上创建的作用域。这意味着您可以通过指令中的“$scope”访问上层作用域变量上那些未被覆盖的字段。
下面的演示动画直观展示了作用域的工作方式:
作用域字段的匿名访问
在实际开发过程中,您可以匿名访问作用域下的字段使代码更加精简:
+click="alert($scope.value)" // 具名方式访问
+click="alert(value)" // 匿名方式访问
请注意,如果在指令表达式的作用域链和全局作用域中都没有声明字段“value”,那么您将不能使用匿名方式进行访问。否则将导致一个ReferenceError。
+click="alert(value)" // 匿名方式访问
作用域示例
我们通过下面的示例来体验下作用域的用法: