Angular 中的 $scope.$watch 在 Ionic/Cordova 中不起作用

$scope.$watch in Angular doesn't work in Ionic/Cordova

我正在使用 Ionic Framework 构建一个应用程序,我现在想为其创建一些开关(基本上是花式风格的复选框)。当有人按下开关时,我想将其发送到服务器,因此我首先尝试捕获开关更改事件。在基本的 angular 安装中,我尝试在 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.

在那之后我可以翻转开关一百万次,但我再也没有收到日志消息,甚至没有错误。由于它在我的 angular 测试网站上运行良好,但在我的应用程序中却不行,所以我有点迷失在可能出错的地方。

有人知道我可以做什么来捕捉这个切换事件吗?欢迎所有提示!

不工作的可能原因 $scope.$watch 可能是 属性 在子范围内覆盖。如果您在控制器作用域上设置 $watch,但在控制器的某些子作用域内创建了具有 ng-model 绑定的复选框,则子作用域可能会创建自己的 mail 属性 和控制器 $ scope.$watch 将无法检测到 属性 中的变化。这是演示此问题的 jsfiddle:link

为避免此问题,您不应在 ng-model 绑定的作用域上使用原始值。相反,您应该绑定到范围内对象的属性,例如 ng-model="formData.mail" 其中 formData 是控制器范围内的某个对象。要观察对象 属性 的变化,您还可以使用点语法:$scope.$watch('formData.mail', function(){...})

希望对您有所帮助。