当前位置: 首页 > 面试题库 >

AngularJS中范围的继承

曹泉
2023-03-14
问题内容

在父控制器作用域中,我已定义将selectedItem其设置为“ x”。然后在子范围中,我selectedItem使用ngModel 进行了定义

<div ng-app>
  <div ng-controller="CtrlA">
       <div ng-controller="CtrlB">
         <select ng-model="selectedItem" ng-options="item for item in items">
         </select>
      </div>
  </div>
</div>

function CtrlA($scope) {
    $scope.selectedItem = 'x';
    $scope.items = ['x', 'y'];
}

function CtrlB($scope) {}

加载页面后,selectedItem会按预期正确设置为“ x”。当我选择“ y”时,selectedItem在CtrlB中$
scope会按预期给出“ y”。

但是,当我检查$scope.selectedItemCtrlA范围(使用AngularJS的batarang),它给“X”。

jsFiddle:http :
//jsfiddle.net/sudhh/GGKjp/2/

预览页面:http :
//fiddle.jshell.net/sudhh/GGKjp/2/show/light/(用于与angularjs batarang一起检查)

为什么$scope.selectedItemCtrlA范围内没有得到更新,以“Y”?有什么解释?

我不希望使用事件或在父范围内rootScope进行更新selectedItem(出于学习目的)。


问题答案:

如果尝试绑定到在父作用域上声明的基元,则子作用域中的selectedItem将有效地遮盖父作用域中同名的属性。

在这种情况下,有3个选择

  1. 在模型的父级中定义对象,然后在子级中引用该对象的属性:ref.selectedItem
  2. 使用$ parent.selectedItem(并非总是可能,但比1.容易)
  3. 在父级作用域上定义一个函数,然后从子级调用它,将原始值传递给父级(并非总是可能的)

有关它的更多信息,请参见https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-
Prototypal-Inheritance

您可以使用第一种方法在http://jsfiddle.net/sudhh/XU2rP/1/中找到更新的提琴。

function CtrlA($scope) {
  $scope.items = ['x', 'y'];
  $scope.ref = {
    selectedItem: 'x'
  };
}


 类似资料:
  • 问题内容: 我是Angular的新手,所以我想按照教程学习,只是不懂而已。令我困惑的是点符号: 在任何输入框中键入一个值将更新所有其他输入框。因此,我认为这是控制器外部的第一个声明将输入元素值绑定到根作用域中的data.message模型。我不明白里面的绑定是如何从中读取值的。根作用域,为什么插入作用域内的值将显示在该作用域外的输入框中? 另外如果被删除 那个行为不见了,怎么会这样? 问题答案:

  • 问题内容: “ API参考范围”页面显示: 范围可以从父范围继承。 该开发者指南范围页说: 范围(典型地)从其父范围继承属性。 那么,子作用域是否总是从原型上继承自其父作用域? 有例外吗? 当它继承时,是否总是正常的JavaScript原型继承? 问题答案: 子作用域通常是从其父作用域继承的,但并非总是如此。该规则的一个例外是带有的指令-这会创建一个“隔离”作用域,该作用域不会原型继承。创建“可重

  • 问题内容: 在Angularjs中,是否有特定的原因要在控制器中使用,并且要在指令链接函数中使用(不使用)?这仅仅是公约还是其他? 问题答案: 该情况下,当你在控制器的依赖注入范围内喷射基于匹配变量名使用,在这种情况下,因为名字是行不通的。 对于指令的情况下,注塑基于位置,所以你可以命名你的变量或或任何东西。链接功能的指令顺序为 因此,第一个元素始终是作用域对象。

  • 问题内容: 我有一个从或指令属性或任何其他属性中获得的字符串,我想基于此在作用域上创建一个变量。所以: 但是,如果字符串包含一个或多个点,我想将其拆分并实际上“向下钻取”到作用域中。所以应该成为。这意味着简单版本不起作用! 在读取基于字符串的变量时,您可以通过做来获得这种行为,但是在分配值时如何实现呢? 问题答案: 我发现的解决方案是使用$ parse。 “将Angular表达式转换为函数。” 如

  • 问题内容: 我想知道如何在给定父范围的情况下获取所有子范围的列表。我可以从该范围的属性中找到$ childHead,$ childTail,$ nextSibling和$$ prevSibling。 我现在使用的方法是从父级获取childHead,然后使用nextSibling获取下一个孩子,直到nextSibling为空。 有没有更好的方法?鉴于我想在所有子项上调用方法[getModel],是否

  • 问题内容: 如果我有以下控制器: 读出的正确方法是什么?如果有必要定义中,也不会使它语义上不正确假设是描述相关的东西的属性,而不是? 更新: 对此进行进一步的思考,如果一个孩子有多个孩子,将会在检索上产生冲突。我的问题是,什么是访问的正确方法是从? 问题答案: AngularJS中的作用域使用原型继承,当在子作用域中查找属性时,解释器将从子对象开始查找原型链,并继续寻找父对象,直到找到该属性为止,