2015-04-02 333 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