2015-12-07 56 views
1

我不明白爲什麼角度ng-change函數僅在第一次點擊時被調用。在這個例子中角度廣播ng-change只有第一次工作

http://jsfiddle.net/ZPcSe/5/

函數被調用每一次當我改變當前的無線選擇,但在我的代碼的東西是錯誤

http://jsfiddle.net/4jL3u8ko/1/

有人可以改變我的代碼,就像第一個例子上班,並解釋它爲什麼不起作用?

+0

這兩個js小提琴工作正常。 –

+0

http://stackoverflow.com/questions/13714884/difficulty-with-ng-model-ng-repeat-and-inputs這就是原因 – Atais

+0

Abhilash P A - 第二個jsfiddle是不正確的!無線電方法第一次調用 – kris14an

回答

3

偉大的問題。

這不是一個答案,但可以將這個解釋稱爲答案和任何可能發生的進一步問題。這經常發生,所以它很重要。 @Victor給出的答案沒問題,@Atias的評論也很有幫助。

說明 -

簡單解釋:ng-repeat形成子範圍。

小細節:

所以,你的應用程序有3個領域(或可能取決於值的$ scope.radioButtons數量的增加)。讓我給它們命名 - parentScope(主範圍),childScope1(ng-repeat的第一個元素的範圍)和childScope2(ng-repeat的第二個元素的範圍)。

父範圍變量:calledFunctions(陣列),單選按鈕(對象)和NEWVALUE(功能)

ChildScope1變量:名稱(在開始時分配一個文字),纈氨酸(分配對象開始)和值(它沒有價值,或undefined)

ChildScope2變量:名稱(在開始分配的文字),VAL(在啓動分配一個對象)和值(它沒有價值,或undefined)

會發生什麼當你點擊childScope1的單選按鈕時(第一次):

ChildScope1.value = ChildScope1.name或ChildScope1.value =「Radio1」; ng-change指令檢查這個範圍的模型是否被改變了?是的,因爲它是未定義的,現在它有一個文字(「Radio1」)!所以調用ChildScope1.newValue(),顯然不存在。因此,現在查找父母調用parentScope.newValue()。這是現在,所以執行它。

請記住,ChildScope1.value =「Radio1」;

點擊其他單選按鈕...... 現在我們點擊第二次ChildScope1的單選按鈕。點擊後 - ChildScope1.value = ChildScope1.name或ChildScope1.value =「Radio1」; ng-change指令檢查這個範圍的模型是否已經改變?沒有!!因爲它仍然包含與以前相同的字面值,所以甚至不要查找ChildScope1.newValue()或ParentScope.newValue()函數。

現在ChildScope2也會發生同樣的情況。

希望這解釋了爲什麼你的小提琴像一次性裝訂,或者@Victor或@Atias是如何正確的。

簡單的解決方案是 - ChildScope1或ChildScope2或任何其他子作用域的ng模型應指向父作用域的變量。因此,您可以使用$ parent或使用屬性(例如ParentVal = {ChildVal =「」};)在父範圍(主範圍)中創建一個對象。並且在ng-model中ng-repeat-write ng-model = ParentVal.ChildVal。

對不起,我可憐的英語,請原諒我的拼寫錯誤,如果有的話。

謝謝

1

ng-model很棘手。您應該始終在模型中始終保留一個點,否則在創建多個模型時您會遇到這種問題,並且您認爲您只有一個模型。

作爲快速解決方案,請在ng-modelng-change之間使用$parent.value而不是value

作爲一個良好的修正,具備在範圍的適當模型對象,而不是直接在範圍存儲值:

$scope.model = {}; 

ng-model="model.radiosValue" 

作爲一個更好的修復程序,使用controllerAs圖案,並使用該對象作爲查看模型。

+0

在我的例子中$ scope.value只是所選無線電名稱的名稱,就像在第一個jsfiddle – kris14an