2015-04-02 174 views
1

我最近花了4个多小时才弄清楚为什么我的ng-model指令与ng-options结合使用没有正确绑定到我的控制器中的属性。 <select>元素正在被正确初始化 - 从控制器(父)范围接收一个值。但子范围没有正确更新父范围。检查出的下列问题和plunkers后,我就能够制定了“变通”针对此问题:AngularJs避免范围问题

Helpful stackoverflow question 1

Helpful stackoverflow question 2

Basic Plunker

我发现财产,我结合在我的<select>元素中绑定到控制器的子范围内的同名属性 - 因此,该值没有按照控制器范围内的预期反映出来。改变

<select ng-options="asset as asset.Name for asset in allAssets" ng-model="selectedAsset" ng-change="lookupAssetPermissions()"></select> 

<select ng-options="asset as asset.Name for asset in allAssets" ng-model="$parent.selectedAsset" ng-change="lookupAssetPermissions()"></select> 

后在selectedAsset值被正确地绑定到属性在控制器的范围(如在ng-change事件处理程序看到的)。我的元素的整个背景是:

<!---outer div has controller level scope-----> 
<div> 
    <!---inner div creates child scope with ng-if-----> 
    <div ng-if="true condition here"> 
     <!---select statement from above-----> 
     <select ng-model="$parent.selectedAsset">...</select> 
    </div> 
</div> 

我必须用比故意结合父作用域其它这种情况下任何其他的选择吗?如果我有多个子范围(嵌套ng-if语句),是否需要更改ng-model以绑定到$parent.$parent.$parent....selectedAsset以更新我的控制器作用域中的值?在这个主题上是否有任何“最佳实践”?

回答

1

把所有变量的一些对象即内:

$scope.Model = { 
    selectedAsset : 'mySelectedAsset1', 
    selectedAsset2 : 'mySelectedAsset2', 
    selectedAsset3 : 'mySelectedAsset3' 
} 

然后,您可以:

<div ng-repeat> //new scope 
<div ng-repeat> // new scope 
<input ng-model="Model.selectedAsset"> 

这也低点您在$范围“依赖”,定义这样的模型对象将呈现给大家谁是阅读你的代码你有什么模型。

+0

干净。和功能。我以前见过这个解决方案,但不知道它的使用优势。非常感谢。 – miniscem 2015-04-02 14:47:14