AngularJS:正确使用ng-model

时间:2016-01-19 13:58:12

标签: angularjs

当我遇到与ng-model ng-includeng-switchng-view等指令相关的问题时,我正在阅读Angular js docs。提到的原因是child scopeparent scope,但我完全无法理解。
还有人提到,通过遵循"最佳实践"可以很容易地避免使用原语问题。总是有一个'。在ng-model中。
这是link
任何人都可以用技术性较低的语言解释一下吗?

1 个答案:

答案 0 :(得分:2)

ng-includeng-switchng-if创建子范围。 这意味着如果你创建

<div ng-controller="MyCtrl">
  <div id="innerDiv" ng-if="!something">
    <input ng-model="model">
  </div>
</div>` 

model将在#innerDiv创建的范围内创建(因为使用ng-if)。如果要在控制器中使用model值,则可能会出现问题,因为它不可能(父作用域无法访问子作用域的属性!)。

解决方案是在$parent.model中使用<input ng-model="model">。然后,属性将在父级的范围内更改,这是您通常希望实现的。

然而,使用$parent可能对某人不利,因此更好的解决方案是在控制器中创建命名模型。您可以使用它并遵循“永远有'的规则。”你的ng模型。“由ng-if创建的子范围可以访问parrent范围,因此他可以使用已定义的$scope.model并更改$scope.model.text属性。

控制器:

$scope.model = {};

HTML:

<div ng-controller="MyCtrl">
   <div id="innerDiv" ng-if="!something">
     <input ng-model="model.text">
   </div>
</div>`

(但请记住,如果你没有在控制器中定义$scope.model,它的行为就像第一个例子中那样。)

如果您不确定自己是否在同一范围内,可以通过显示范围$id进行检查。只需在{{$id}}(或ng-ifng-include)上方添加html ng-switch即可。

<div ng-controller="MyCtrl">
   scope id: {{$id}}
   <div id="innerDiv" ng-if="!something">
     child scope id:{{$id}}
   </div>
   <div>scope id again {{$id}}</div>
</div>`

一些例子: https://jsfiddle.net/La90btfh/3/