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

Angular中的范围继承

子车英达
2023-03-14
问题内容

我是Angular的新手,所以我想按照教程学习,只是不懂而已。令我困惑的是点符号:

<div ng-app="">
  <input type="text" ng-model="data.message">
  <h1>{{ data.message }}</h1>

  <div ng-controller="FirstCtrl">
    <input type="text" ng-model="data.message">
    <h1>{{ data.message }}</h1>
  </div>

  <div ng-controller="SecondCtrl">
    <input type="text" ng-model="data.message">
    <h1>{{ data.message }}</h1>
  </div>
</div>

在任何输入框中键入一个值将更新所有其他输入框。因此,我认为这是ng- model控制器外部的第一个声明将输入元素值绑定到根作用域中的data.message模型。我不明白里面的绑定ng- controller是如何从中读取值的。根作用域,为什么插入ng-controller作用域内的值将显示在该作用域外的输入框中?

另外如果data.被删除

<div ng-app="">
  <input type="text" ng-model="message">
  <h1>{{ message }}</h1>

  <div ng-controller="FirstCtrl">
    <input type="text" ng-model="message">
    <h1>{{ message }}</h1>
  </div>

  <div ng-controller="SecondCtrl">
    <input type="text" ng-model="message">
    <h1>{{ message }}</h1>
  </div>
</div>

那个行为不见了,怎么会这样?


问题答案:

第一个示例是在Angular中推荐的处理方式。最好的做法是,您的ngModels中应始终有一个圆点,因为在中使用基元ngModel是Angular中常见的错误来源。

Angular的理解范围文档中对此进行了详细讨论:

通过遵循始终具有“’
”的“最佳实践”,可以很容易地避免使用基元出现此问题。在您的ng模型中
-观看3分钟值得。Misko演示了ng-switch的原始绑定问题。

简而言之,这是由于Javascript的原型继承是如何工作的。

在第二个示例中 ,每个 示例中
都有一个原始类型(例如字符串ngModel。当ngModel每个控制器中的in(每个控制器在各自的子作用域上)尝试从基本类型 读取时
,它们将首先查看其父级以查看变量是否存在。如果是,那么他们从中读取。但是,当其中一个ngModels 写入
该原语时,则在其作用域上添加该原语的新实例。

因此,每个input变量在仅被读取时,首先共享一个公共变量(在您的顶级示波器上),然后input在写入每个变量时切换为使用独立变量。您可以通过首先输入顶部,父级,然后输入子级来观看此小提琴中的实际操作input

Angular建议避免这种情况,因为读写操作之间的不匹配很容易造成混淆,并且容易出错

在第一个示例中,
您将创建一个data带有属性的对象message。在这种情况下,读取的工作方式就像使用基元一样,它看起来是在父作用域上找到具有该属性的对象,然后从那里读取。但是这次写入与读取的工作方式相同-
如果有一个data具有属性的父对象,message则写入该对象的属性。

所以, 当你使用点符号,始终读取和写入的行为 ,你可以看到在这个小提琴



 类似资料:
  • 问题内容: 在父控制器作用域中,我已定义将其设置为“ x”。然后在子范围中,我使用ngModel 进行了定义: 加载页面后,会按预期正确设置为“ x”。当我选择“ y”时,在CtrlB中$ scope会按预期给出“ y”。 但是,当我检查的范围(使用AngularJS的batarang),它给“X”。 jsFiddle:http : //jsfiddle.net/sudhh/GGKjp/2/ 预览

  • 问题内容: 页面刷新时,我试图从sessionStorage检索搜索和过滤数据。 sessionStorage.restorestate返回未定义,有人知道为什么吗? Plunkr:http://plnkr.co/edit/oX4zygwB0bDpIcmGFgYr?p = preview 问题答案: 当您在Angular应用程序中刷新页面时,就像完全重新启动应用程序一样。因此,要从会话存储中还原,

  • 问题内容: 我在理解/使用角度UI模式的范围时遇到麻烦。 尽管这里没有立即显示出来,但我已经正确地设置了模块和所有内容(据我所知),但是这些代码示例尤其是在我发现错误的地方。 index.html(重要部分) Controller.js(同样是重要部分) create.html(全部) 因此,我的问题是:为什么作用域未与UI双重绑定?为什么有自定义值,但没有? 我试图在create.html中将它

  • 发现了一个非常有趣的问题,在调试后找到了重现它的场景。 因此,如果我有一个具有包范围B的类,它有一些公共方法和扩展它的公共类A: 然后在测试中: 你猜怎么着,我得到了我刚刚抛出的NullPointerException,所以Mockito以某种方式创建了一个“真实”的对象,并调用了一个真正的方法,而不是一个被嘲笑的方法。为什么会这样? 在上面的示例中,我在类<code>B<code>中更改了<co

  • 问题内容: 尽管在ChildCtrl中实例化了一个“新”变量,我如何进行变量更改并将其轻松传播回ParentCtrl?加分点数最少,甚至没有$ on和$ watch(使其更易于实现) ParentCtrl ChildCtrl / ChildCtrl2 / ChildCtrl3 / ChildCtrl4 视图 我的ChildCtrl的区别就足够大了,我无法轻松抽象出主布局和ng-view,但是它们都

  • 问题内容: 使用定义控制器的原始方法 ,访问父级的作用域非常简单,因为子级作用域原型继承自其父级。 Controller-As方法 似乎是声明控制器的推荐方法。但是,对于Controller-A,上述方法不再有效。 当然,我可以通过View 访问父作用域: 我确实有一些问题(意大利面条代码可能存在),但是这个问题是关于从子控制器访问父作用域的。 我看到此工作的唯一方法是: 因此,现在,子控制器需要