我们可以继承范围(或者我可以将其视为通常的外部范围/内部范围方案):
相同的控制器: https://jsfiddle.net/fk4hzvxw/
不同的控制器: https://jsfiddle.net/fk4hzvxw/1/
<div ng-app="myApp">
<div ng-controller="hihi">
<div ng-init="ha = 42"></div>
<input type="text" ng-model="ha"> {{ ha }}
<div ng-controller="hello">
<input type="text" ng-model="ha"> {{ ha }}
</div>
</div>
</div>
所以我认为,据说,控制器&#34; hihi&#34;创建一个范围,控制器&#34;你好&#34;还创建了一个范围,并继承了控制器&#34; hihi&#34;创建的范围。 (或者我可能认为它只是外部范围和内部范围,就像在传统程序中一样 - 这是一种正确的思考方式吗?)
我们可以输入第一个输入框,屏幕上的所有值都会更新为相同的值。但是,当我们输入第二个输入框时,第二个变量似乎是“#34;起飞为自己的&#34;”。现在有两个变量ha
,一个在外部范围,一个在内部范围,当我们输入2输入框时,它们只影响它自己的范围变量。
我们应该如何看待这个?在传统的编程中,这不会发生。另外,这有什么含义?
答案 0 :(得分:1)
这可能发生在传统节目中。将范围视为一系列Javascript对象,其中每个对象都将父范围作为其原型。无论何时访问对象的属性,都会搜索原型链,直到找到匹配为止,但分配给属性只是将其分配给对象本身。
在其他语言中,您可能会看到类似的内容,例如在Python中访问类的属性会搜索所有父类,但在对象上分配它会隐藏所有父值。
在Angular中避免这种情况的方法是始终使用'controller as'语法。这为每个控制器提供了一个名称,然后您就可以确定哪个控制器将更新其模型。
<div ng-app="myApp">
<div ng-controller="hihi as hihi">
<div ng-init="ha = 42"></div>
<input type="text" ng-model="hihi.ha"> {{ hihi.ha }}
<div ng-controller="hello as hello">
<input type="text" ng-model="hello.ha"> {{ hello.ha }}
</div>
</div>
</div>
但是在控制器代码中你可以通过this
访问属性,而不是使用$scope
(并且还有一个约定,你在控制器的顶部做var vm=this;
并使用{ {1}}以避免嵌套函数中出现vm
变化的问题。)
答案 1 :(得分:0)
(或者我可能会认为它只是外部范围和内部范围,如a 传统程序 - 这是一个正确的思考方式吗?)
烨。这与 JavaScript如何工作(范围链)有关,而不是与AngularJS有关。
当JavaScript解释器遇到变量时,它会在当前范围内搜索它。如果它找不到它,它将移动到当前范围的外部范围,并继续向上移动范围链,直到找到该变量。
您可以阅读JavaScript范围链here.