我无法理解为什么只在第一次点击时调用angular ng-change
函数。在这个例子中
函数,但是在我的代码中出现了错误
http://jsfiddle.net/4jL3u8ko/1/
有人可以将我的代码改为像第一个例子一样工作,并解释它为什么不起作用吗?
答案 0 :(得分:4)
很棒的问题。
这不是答案,但可以将此解释称为答案以及可能发生的任何其他问题。这种情况经常发生,所以理解它很重要。 @Victor给出的答案还可以,@ Atias的评论也很有帮助。
说明 -
简单说明:ng-repeat形成子范围。
小详细:
因此,您的应用程序有3个范围(或者可能会增加,具体取决于$ scope.radioButtons中的值的数量)。让我命名它们 - parentScope(主范围),childScope1(ng-repeat的第一个元素的范围)和childScope2(ng-repeat的第二个元素的范围)。
父范围变量:calledFunctions(array),radioButtons(object)和newValue(function)
ChildScope1变量:name(在开始时分配一个文字),val(在开始时分配一个对象)和值(它没有值或未定义)
ChildScope2变量:name(在开始时分配一个文字),val(在开始时分配一个对象)和值(它没有值,或未定义)
单击childScope1的单选按钮(第一次)时会发生什么:
ChildScope1.value = ChildScope1.name或ChildScope1.value =" Radio1&#34 ;; ng-change指令检查此范围的模型是否已更改?是的,因为它是未定义的,现在它有一个文字(" Radio1")!!所以调用ChildScope1.newValue(),这显然不存在。因此,现在寻找父调用parentScope.newValue()。这是存在的,所以执行它。
请记住,ChildScope1.value =" Radio1&#34 ;;
点击其他单选按钮后...... 现在让我们在ChildScope1的单选按钮上单击第二次。点击它后 - ChildScope1.value = ChildScope1.name或ChildScope1.value =" Radio1&#34 ;; ng-change指令检查此范围的模型是否已更改?没有!!因为它仍然包含与以前相同的文字vaule,所以甚至不要查找ChildScope1.newValue()或ParentScope.newValue()函数。
现在ChildScope2也是如此。
希望这能解释为什么你的小提琴就像一次性绑定,或者@Victor或@Atias是如何正确的。
简单的解决方案是 - ChildScope1或ChildScope2的ng模型或任何其他子范围应该指向父范围的变量。因此,您可以使用$ parent或在父作用域(主作用域)中使用属性创建对象(例如,-ParentVal = {ChildVal =""};)。在ng-model中,ng-repeat- write ng-model = ParentVal.ChildVal。
抱歉我的英语很差,请原谅我的拼写错误,如果有的话。
由于
答案 1 :(得分:1)
ng-model
很棘手。你应该总是在模型中总是有一个点,或者你在创建几个模型时遇到这种问题而你认为你只有一个模型。
作为快速解决方法,请在$parent.value
和value
中使用ng-model
而非ng-change
。
作为一个很好的修复,在范围内有一个合适的模型对象,而不是直接在范围内存储值:
$scope.model = {};
ng-model="model.radiosValue"
作为更好的解决方案,请使用controllerAs
模式并将该对象用作视图模型。