在视频AngularJS MTV聚会:最佳实践( 2012/12/11 )中,Miško解释说:“ ..如果您使用ng-model,则必须在某处添加点。如果您没有点,那么您就在做错误..”
但是,Angular.JS网站中的第一个示例(基础知识)似乎与此矛盾。是什么赋予了?自从MTV聚会以来,Angular.JS是否已更改,因为它现在对ng-model更宽容了?
在视频AngularJS MTV聚会:最佳实践( 2012/12/11 )中,Miško解释说:“ ..如果您使用ng-model,则必须在某处添加点。如果您没有点,那么您就在做错误..”
但是,Angular.JS网站中的第一个示例(基础知识)似乎与此矛盾。是什么赋予了?自从MTV聚会以来,Angular.JS是否已更改,因为它现在对ng-model更宽容了?
Answers:
在处理范围继承的复杂性时,这个小点非常重要。
该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>
首先,如果您启动了该应用程序,并输入了父输入,则子代将进行更新以反映它。
但是,如果您编辑子作用域,则与父作用域的连接现在断开,并且两者不再同步。另一方面,如果使用ng-model="baz.bar"
,则链接将保留。
发生这种情况的原因是,子作用域使用原型继承来查找值,因此,只要它从未在子作用域上设置,就将遵从父作用域。但是,一旦设置,它将不再查找父级。
当您使用对象(baz
)时,子作用域上一无所有,继承关系仍然保留。
有关更多详细信息,请查看StackOverflow答案
controllerAs
和bindToController
语法)或服务上。
当您从一个原型继承另一个范围时,例如在ng-repeat的情况下,将需要Dot,这是为每个原型从父范围继承的订单项创建一个新的范围。在基本示例中,没有原型继承,因为只有一个作用域,但是如果您有多个子作用域,那么您将开始面对问题。下面的链接将使所有内容变得清晰。
https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-repeat
根据@OverZealous的回答,我为此想到了一个肮脏但轻松自如的快速解决方法:
$scope.$s = $scope
$scope.foo = 'hello'
然后$s
在模板中使用可以安全地修改模型:
<input ng-model="$s.foo"/>
我为我的项目中的此类肮脏作品编写了服务。
$scope
用作视图模型,而其他人则没有。这是一个优先事项。