[英]Angular scope binding
我正在看书,并使用以下版本的Angular: https : //ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.js[1]
这是我的模板:
<div ng-controller="ParentController">
<div ng-controller="ChildController">
<a ng-click="sayHello()">Say hello</a>
</div>
{{ person }}
</div>
这是我的控制器代码:
app.controller('ParentController', function ($scope) {
$scope.person = { greeted: false };
});
app.controller('ChildController', function ($scope) {
$scope.sayHello = function () {
$scope.person = { name: "Ari Lerner", greeted: true };
}
});
我注意到我的代码不会不会按预期更新模板,除非我将sayHello方法更改为:
$scope.sayHello = function () {
$scope.person.name = "Ari Lerner";
$scope.person.greeted = true;
};
关于为什么会这样的任何见解? 我当时假设更新人员将反映在DOM中。
使用1.4.2会产生相同的结果。
考虑到属性的索引可能有所不同,我尝试了以下操作:
$scope.person.name = { greeted: true, name: "Ari Lerner" };
(交换问候和名字)
疯狂的猜测:在我看来,Angular中的某些内容正在保留分配给$ scope.person的原始对象,并将$ scope.person设置为新对象会“丢失”数据绑定。 这是真的?
在AngularJS中,范围使用其父级的原型继承。
原型继承基本上意味着,如果JavaScript在子作用域上找不到属性,它将查看父作用域。
因此,当您执行$scope.person.name = 'Ari Lerner'
,JavaScript会查看$scope
,看到它没有person
属性,然后转到它的父级(父级作用域),看到它有一个person
属性,并将其name
属性分配给'Ari'
。
另一方面,当您执行$scope.person = { ... }
,JavaScript不在乎该属性是否存在-它只是执行分配,确保您的$scope
现在具有person
属性。 这里的问题是您的子作用域的person
属性现在会遮盖父作用域的person
属性,而父属性仍然具有其原始值。 因此,在父控制器中, person
永远不会改变。
要进一步阅读,请在此处检查以下答案:
您正在创建一个从其父范围原型继承的子范围。 除非您使用隔离范围(指令),否则会出现这种情况。
有关真正的绝佳解释,请参阅此处AngularJS中范围原型/原型继承的细微差别是什么?
正如其他人所述,这是因为您的范围。
例如,如果要在childScope中创建一个新对象,则可以执行$scope.someObject = {};
。 现在,JavaScript无法知道两者之间的区别
$scope.someNewObject = {};
和
$scope.person = {};
因为您只是将新对象分配给您的子范围。 另一个表示法起作用,因为通过获取$scope.person.attribute = ...
JavaScript知道,该person对象已经存在。 它开始在您的子范围中寻找该对象,在那里找不到它,转到父范围并在那里找到它并设置属性。
总之,您必须使用$scope.person.attribute
,或者使用$scope.$parent.person = {};
$scope.person.attribute
要从childController(子作用域)编辑$ scope.person,请像这样使用$ scope。$ parent。
app.controller('ChildController', function ($scope) {
$scope.sayHello = function () {
$scope.$parent.person = { name: "Ari Lerner", greeted: true };
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.