我正在使用Ionic Framework构建应用程序,我现在想要创建一些开关(基本上是花哨的样式复选框)。当一个人翻转开关时我想将其发送到服务器,所以我首先尝试捕捉开关更改事件。在基本的角度安装中,我尝试使用html(<input type="checkbox" ng-model="theswitch">
)中的简单复选框和控制器中的$watch
,如下所示:
$scope.$watch('theswitch', function(){
console.log('theswitch changed');
if ($scope.boel){
console.log('theswitch is TRUE');
} else {
console.log('theswitch IS FALSE');
}
});
这就像一个魅力。我现在在我的Ionic应用程序中实现了类似的功能。我的HTML是这样的:
<ion-item class="item-toggle">
Mail
<label class="toggle">
<input type="checkbox" ng-model="mail">
<div class="track">
<div class="handle"></div>
</div>
</label>
</ion-item>
我的控制器看起来像这样:
myControllers.controller('AccountCtrl', function ($scope) {
$scope.$watch('mail', function(){
console.log('THE MODEL CHANGED');
if ($scope.mail) {
console.log('The button was turned ON.');
} else {
console.log('The button was turned OFF.');
}
});
});
加载屏幕后,我得到两个日志:
THE MODEL CHANGED
The button was turned OFF.
之后我可以将交换机翻转一百万次,但我不再收到日志消息,甚至没有错误。由于它在我的角度测试网站中完美运行,但不在我的应用程序中,我有点迷失在可能出错的地方。
有人知道我能做些什么来捕捉这个切换事件吗?欢迎所有提示!
答案 0 :(得分:8)
不工作的可能原因$scope.$watch
可能是在子范围内覆盖的属性。如果在控制器作用域上设置$watch
,但在控制器的某个子作用域内创建了ng-model
绑定的复选框,子作用域可能会创建自己的mail
属性和控制器$作用域。将无法检测到该属性的更改。以下是演示此问题的jsfiddle:link。
要避免此问题,您不应在ng-model
绑定的范围上使用原始值。相反,您应该绑定到作用域上对象的属性,例如ng-model="formData.mail"
其中formData
是控制器范围内的某个对象。要查看对象属性更改,还可以使用点语法:$scope.$watch('formData.mail', function(){...})
希望这有帮助。