为什么AngularJS文档在模型指令中不使用点?

sil*_*tar 70 angularjs

在视频AngularJS MTV Meetup:Best Practices( 2012/12/11 )中,Miško解释说"如果你使用ng-model,那里必须有一个点.如果你没有点,你就是这么做的错误.."

然而,Angular.JS网站上的第一个例子(The Basics)似乎与它相矛盾.是什么赋予了?自从MTV聚会以来Angular.JS有没有改变,现在它对ng-model更加宽容?

Ove*_*ous 107

在处理范围继承的复杂性时,这个小点非常重要.

egghead.io视频"点"有一个很好的概述,做到这一点非常流行的堆栈溢出的问题:什么是范围原型/原型继承的AngularJS的细微差别?

我将在这里总结一下:

Angular.js使用范围继承来允许子范围(例如子控制器)查看父范围的属性.所以,假设你有一个类似的设置:

<div ng-controller="ParentCtrl">
    <input type="text" ng-model="foo"/>
    <div ng-controller="ChildCtrl">
        <input type="text" ng-model="foo"/>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

(在JSFiddle上玩)

首先,如果您启动了应用程序并输入了父输入,则子项将更新以反映它.

但是,如果编辑子范围,则与父级的连接现在已断开,并且两者不再同步.另一方面,如果您使用ng-model="baz.bar",则链接将保留.

发生这种情况的原因是因为子范围使用原型继承来查找值,因此只要它永远不会在子项上设置,那么它将遵循父范围.但是,一旦设定,它就不再查找父母了.

当您使用object(baz)时,在子范围上没有设置任何内容,并且继承仍然存在.

有关更深入的详细信息,请查看StackOverflow答案

  • 那个egghead视频非常值得它的重量.永远都是这个问题的最好描述. (3认同)

Aja*_*wal 17

例如,在ng-repeat的情况下,为原型继承父范围的每个行项创建一个新范围时,将从原型继承另一个范围时需要Dot.在基本示例中,没有原型继承,因为只有一个范围,但如果您有多个子范围,那么您将开始面对问题.以下链接将使一切清晰.

https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-repeat