角度无线电ng-change仅在第一次工作

时间:2015-12-07 10:06:53

标签: javascript angularjs

我无法理解为什么只在第一次点击时调用angular ng-change函数。在这个例子中

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

每当我改变当前的无线电选择时都会调用

函数,但是在我的代码中出现了错误

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

有人可以将我的代码改为像第一个例子一样工作,并解释它为什么不起作用吗?

2 个答案:

答案 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.valuevalue中使用ng-model而非ng-change

作为一个很好的修复,在范围内有一个合适的模型对象,而不是直接在范围内存储值:

$scope.model = {};

ng-model="model.radiosValue"

作为更好的解决方案,请使用controllerAs模式并将该对象用作视图模型。