在视频AngularJS MTV Meetup: Best Practices (2012/12/11)中,Miško解释说“如果你使用ng-model,必须在某个地方有一个点。如果你没有点,你做错了......” / p>
然而,Angular.JS website中的第一个例子(基础知识)似乎与之相矛盾。是什么赋予了?自从MTV聚会以来Angular.JS有没有改变,现在它对ng-model更加宽容?
答案 0 :(得分:106)
在处理范围继承的复杂性时,这个小点非常重要。
egghead.io video "The Dot"有一个非常好的概述,这个非常流行的堆栈溢出问题:What are the nuances of scope prototypal / prototypical inheritance in 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>
首先,如果你启动了应用程序并输入了父输入,孩子会更新以反映它。
但是,如果您编辑子范围,则与父级的连接现在已断开,并且两者不再同步。另一方面,如果您使用ng-model="baz.bar"
,则链接将保留。
发生这种情况的原因是因为子范围使用原型继承来查找值,所以只要它永远不会在子节点上设置,那么它将推迟到父范围。但是,一旦设定,它就不再查找父母了。
当您使用对象(baz
)时,不会在子范围上设置任何内容,并且继承仍然存在。
有关更详细的信息,请查看StackOverflow answer
答案 1 :(得分:17)
当您原型地从另一个范围继承一个范围时,将需要Dot,例如在ng-repeat的情况下,为原型继承自父范围的每个订单项创建一个新范围。在基本示例中,没有原型继承,因为只有一个范围,但如果您有多个子范围,那么您将开始面对问题。以下链接将使一切清晰。
https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-repeat
答案 2 :(得分:0)
所以要解决这个问题,请确保在JS中首先声明父级:
e.g。
$scope.parent
接下来是:
$scope.parent.child = "Imma child";
只做没有父母的孩子会破坏Angular。
答案 3 :(得分:0)
根据@OverZealous的回答,我想到了一个肮脏但又舒适又简单又快速的解决方法:
$scope.$s = $scope
$scope.foo = 'hello'
然后在模板中使用$s
可以安全地修改模型:
<input ng-model="$s.foo"/>
我为我的项目中的此类肮脏作品编写了服务。