避免继承原始值
在 JavaScript 中,分配非原始值(如对象,数组功能,和许多更多),保持基准(在存储器中的地址),以所分配的值。
将原始值(String,Number,Boolean 或 Symbol)分配给两个不同的变量,并更改一个变量,不会同时更改这两个变量:
var x = 5;
var y = x;
y = 6;
console.log(y === x, x, y); //false, 5, 6
但是使用非原始值,因为两个变量都只是保持对同一对象的引用,所以更改一个变量将改变另一个变量 :
var x = { name : 'John Doe' };
var y = x;
y.name = 'Jhon';
console.log(x.name === y.name, x.name, y.name); //true, John, John
在 angular 中,当创建范围时,会为其分配其所有父级属性。但是,之后更改属性只会影响父范围(如果它是非原始值):
angular.module('app', [])
.controller('myController', ['$scope', function($scope){
$scope.person = { name: 'John Doe' }; //non-primitive
$scope.name = 'Jhon Doe'; //primitive
}])
.controller('myController1', ['$scope', function($scope){}]);
<div ng-app="app" ng-controller="myController">
binding to input works: {{person.name}}<br/>
binding to input does not work: {{name}}<br/>
<div ng-controller="myController1">
<input ng-model="person.name" />
<input ng-model="name" />
</div>
</div>
请记住:在 Angular 中,可以通过多种方式创建范围(例如内置或自定义指令或 $scope.$new()
函数),并且跟踪范围树可能是不可能的。
仅使用非原始值作为范围属性将使你处于安全状态(除非你需要不继承的属性,或者你知道范围继承的其他情况)。