2013-03-23 64 views

回答

83

這是一個範圍內的繼承問題,由於ng-switch創建其自己的範圍。

經常提出的一個建議是在模型上始終使用dot。原因在於,當控制器作用域項目是對象而不是基元時,子作用域將創建對初始對象的引用。如果模型是原始的,它將不會更新原始模型。

例如:

<input ng-model="test.value" placeholder="pre" type="text" /> 
$scope.test={value:''} 

另一種方法是使用$parent在HTML模型標記:

<input ng-model="$parent.test" placeholder="pre" type="text" /> 

使用dot方法是一個很好的做法,以避免這些問題,你不不需要考慮更深的嵌套範圍。

使用test.value爲模型演示:http://plnkr.co/edit/CkiF55bLXsYzR6ZjcrJp?p=preview

關於模型dot引用(讀寶貴):https://github.com/angular/angular.js/wiki/Understanding-Scopes

+0

任何理由這種行爲?我花了三個小時試圖找出它,因爲我改變了手動顯示/隱藏我的兩個相同數據的視圖到ng-switch3天和3個源代碼控制版本之前,一切似乎都正常。我有一個select來爲列表中選擇的內容設置當前字符,並且該字符有一個任務列表。一切看起來都可以找到,但是當我點擊我任務上的按鈕時,它正在使用原始父字符。任何方式來訪問點擊方法中的子範圍(我使用executeTask($索引))? – 2013-05-29 04:30:52

9

這是因爲你實際上創建NG-開關內部的子範圍。因此,屬於ngSwitch指令的作用域上存在另一個test屬性。它最初將顯示來自其父範圍的值,但是當您編輯它時,由於它是原始的,它只會編輯子項上的值,而不是父項。原型繼承在這裏不起作用(但這就是我們需要的)。

當您單擊該按鈕時,該按鈕正在alerting/console.logging父範圍上的屬性...子項無法更改。

爲了解決這個問題使用$parent.test在你ngSwitch您的NG-模型屬性:

一個片段:

<span class="pew" ng-switch-when="title2"> 
    <input ng-model="$parent.test" placeholder="pre" type="text" /> 
    {{test}} 
</span> 

And here's a fork of your plunker showing it in action.

3

我遇到類似的問題,我已經通過在控制器創建一個範圍變量求解並用於ng-includeng-switch。這樣,如果你深嵌ng-includeng-switch並繼續,我們仍然可以直接使用該範圍變量。

由於所有子作用域(在這裏,ng-include/ng-switch)從父範圍(通常,控制器範圍)延伸,我們可以在這些子作用域訪問父範圍直接沒有問題。

使用$parent需要寫這樣$parent.$parent.$parent.someProp

例普拉克:http://plnkr.co/edit/8UGH7nUpFmATiXfkYSwr?p=preview

相關問題