在AngularJS中,我们可以继承范围,但内部范围中的新值会创建一个新变量吗?

时间:2016-02-20 11:46:58

标签: angularjs

我们可以继承范围(或者我可以将其视为通常的外部范围/内部范围方案):

相同的控制器: 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输入框时,它们只影响它自己的范围变量。

我们应该如何看待这个?在传统的编程中,这不会发生。另外,这有什么含义?

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.