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(){...})
希望对您有所帮助。
我正在使用 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(){...})
希望对您有所帮助。