AngularJS文档为什么不在模型指令中使用点?
在videoAngularJS MTV Meetup:最佳实践( 2012/12/11 )中 ,Miško解释说:“如果你使用ng-model,那么必须有一个点,如果你没有一个点,错误..”
然而, Angular.JS网站中的第一个例子(基础)似乎与它相矛盾。 是什么赋予了? 自MTV大会以来,Angular.JS已经发生了变化,现在它更加宽容了ng-model?
处理范围inheritance的复杂性时,这个小点非常重要。
egghead.iovideo“The Dot”有一个非常好的概述,就像这个非常stream行的堆栈溢出问题: AngularJS中范围原型/原型inheritance的细微差别是什么?
我会尽量在这里总结一下:
Angular.js使用作用域inheritance来允许子作用域(例如子控制器)查看父作用域的属性。 所以,假设你有一个像这样的设置:
<div ng-controller="ParentCtrl"> <input type="text" ng-model="foo"/> <div ng-controller="ChildCtrl"> <input type="text" ng-model="foo"/> </div> </div>
( 在JSFiddle上玩 )
首先,如果你启动了应用程序,并input到父母的input,孩子会更新,以反映它。
但是,如果您编辑子作用域,则与父级的连接现在会断开,并且两者不再同步。 另一方面,如果你使用ng-model="baz.bar"
,那么链接将保持不变。
发生这种情况的原因是因为子范围使用原型inheritance来查找值,所以只要它永远不会被设置在子元素上,那么它就会遵循父范围。 但是,一旦设置,它不再查找父母。
当你使用一个对象( baz
)时,没有任何东西被设置在子范围上,inheritance依然存在。
有关更深入的详细信息,请查看StackOverflow答案
当你原型地从另一个范围inheritance另一个范围时,例如在ng-repeat的情况下,为每个从父范围原型inheritance的行项目创build一个新的范围。 在基本的例子中,没有原型inheritance,因为只有一个范围,但是如果你有一些子范围,那么你将开始面对这个问题。 下面的链接将使一切都清楚。
https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-repeat
所以为了解决这个问题,确保在JS中声明父对象:
例如
$scope.parent
其次是:
$scope.parent.child = "Imma child";
只要没有父母的孩子就会打破Angular。