[英]Angularjs only triggering ng-change on input radio the first time its selected
[英]Angular radio ng-change works only first time
我不明白为什么只有在第一次单击时才调用角度ng-change
函数。 在这个例子中
每次更改当前收音机选择时都会调用该函数,但是在我的代码中出现了问题
http://jsfiddle.net/4jL3u8ko/1/
有人可以更改我的代码以使其像第一个示例一样工作,并解释为什么它不起作用吗?
好问题。
这不是答案,但可以将此解释称为答案以及可能发生的任何其他问题。 而且这种情况经常发生,因此了解这一点很重要。 @Victor给出的答案是可以的,@ Atias的评论也很有帮助。
说明-
简单说明:ng-repeat形成子范围。
详细一点:
因此,您的应用程序具有3个作用域(或可能会增加,具体取决于$ scope.radioButtons中值的数量)。 我给它们命名-parentScope(主作用域),childScope1(ng-repeat的第一个元素的作用域)和childScope2(ng-repeat的第二个元素的作用域)。
父作用域变量:称为Functions(数组),radioButtons(对象)和newValue(function)
ChildScope1变量:name(在开始时分配一个文字),val(在开始时分配一个对象)和value(它没有值或未定义)
ChildScope2变量:name(在开始时分配一个文字),val(在开始时分配一个对象)和value(它没有值或未定义)
第一次单击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-model应该指向父范围的变量。 因此,您可以使用$ parent或在具有属性的父作用域(主作用域)中创建对象(例如-ParentVal = {ChildVal =“”};)。 并在ng-repeat-内的ng-model中编写ng-model = ParentVal.ChildVal。
对不起,我的英语不好,请原谅我的拼写错误。
谢谢
ng-model
非常棘手。 您应该始终在模型中始终有一个点,否则在创建多个模型而您认为只有一个时会遇到这种问题。
作为快速解决方案,请使用$parent.value
而不是ng-model
和ng-change
value
。
作为一个好的解决方案,在范围内有一个合适的模型对象,而不是直接在范围内存储值:
$scope.model = {};
ng-model="model.radiosValue"
作为更好的解决方案,请使用controllerAs
模式并将该对象用作视图模型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.