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

时间:2015-03-18 16:14:59

标签: javascript angularjs cordova ionic-framework

我正在使用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.

之后我可以将交换机翻转一百万次,但我不再收到日志消息,甚至没有错误。由于它在我的角度测试网站中完美运行,但不在我的应用程序中,我有点迷失在可能出错的地方。

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

1 个答案:

答案 0 :(得分:8)

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

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

希望这有帮助。