当我遇到与ng-model
ng-include
,ng-switch
和ng-view
等指令相关的问题时,我正在阅读Angular js docs。提到的原因是child scope
和parent scope
,但我完全无法理解。
还有人提到,通过遵循"最佳实践"可以很容易地避免使用原语问题。总是有一个'。在ng-model
中。
这是link
任何人都可以用技术性较低的语言解释一下吗?
答案 0 :(得分:2)
ng-include
,ng-switch
和ng-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-if
,ng-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>`