(译)理解AngularJS中的Scopes
(初次翻译,有些地方翻译的不准确,还请对照原文理解:https://github.com/angular/angular.js/wiki/Understanding-Scopes) 概要AngularJS中,子作用域通常是原型继承自他的父作用域。这个规则的一个例外就是使用了 作用域继承通常都是很直接明了的,并且你通常甚至不知道它发生了…直到你在子作用域应用了双向数据绑定(也就是 这个原始数据类型的问题可以很简单避免,通过使用“最佳实践”:总是使用 使用 如果你实在是想使用或者需要使用原始数据类型的话,这有两种解决方法:
JavaScript中的原型继承首先需要有一个清晰牢固的理解对于JavaScript的原型继承,特别如果你是从后端转来的并且你更熟悉类继承。 我们先来回复一遍: (注意存储空间,我显示anArray对象以单个蓝色对象,有着3个值,而不是单个蓝色对象有着三个灰色相间隔的灰色字符排版) 如果我们试图从子作用域访问一个定义在父作用域上的属性,JavaScript将会首先在子作用域上查找,如果未找到则查找继承作用域,并且找到了那个属性(如果未在父作用域中找到则继续向上查找原型链,直到根作用域),所以这些表达式的值都是true: childScope.aString === 'parent string'
childScope.anArray[1] === 20
childScope.anObject.property1 === 'parent prop1'
childScope.aFunction() === 'parent output'
如果我们接下来这样做: childScope.aString = 'child string'
原型链就不在被查询,并且一个新的 假如我们接下来这么做: childScope.anArray[1] = 22
childScope.anObject.property1 = 'child prop1'
这个原型链将被查询因为这些对象(anArray和anObject)没有在子作用域中找到。这些对象在父作用域中找到了并且属性值被更新了在原来的对象上。没有在子作用域上添加新属性,没有新的对象被创建(注意,在JavaScript中数组和方法也是对象)。 如果我们接下来这么做: childScope.anArray = [100,555] childScope.anObject = { name: 'Mark',country: 'USA' }
这个原型链没有被查询并且子作用域获得了两个新的对象属性,并且隐藏了父作用域中的同名属性。 要点
最后一中情况: delete childScope.anArray
childScope.anArray[1] === 22 // true
我们先删除了子作用域的属性,然后我们试图再次访问这个属性,那么原型链将被查询。 这里有一个例子你会看到以上的JavaScript原型继承的修改后的例子和他们的结果 AngularJS作用域继承重点: 注意,默认情况下指令不会创建新的作用域,也就是说默认的是 ng-include假设我们在自己的控制器中有: $scope.myPrimitive = 50;
$scope.myObject = {aNumber: 11};
以及我们的HTML: <script type="text/ng﹖emplate" id="/tpl1.html"> <input ng﹎odel="myPrimitive"> </script>
<div ng |