我有一个创造指南针的离子ngCordova应用程序。它工作正常,但我对clearWatch()的调用并没有做任何事情。
我有一个带有两个按钮的模板:
<ion-view title="Compass Page">
<ion-content>
<button class="button" ng-click="startCompass()">Start</button>
<button class="button" ng-click="stopCompass()">Stop</button><br>
{{dir}}
</ion-content>
</ion-view>
控制器如下:
angular.module('starter')
.controller('CompassCtrl', function($scope, $cordovaDeviceOrientation) {
$scope.dir = 0;
$scope.startCompass = function() {
var options = {
frequency: 500
};
$scope.watchId = $cordovaDeviceOrientation.watchHeading(options)
.then(
null,
function(error) {
console.log(error);
},
function(result) {
$scope.dir = result.trueHeading;
}
);
};
$scope.stopCompass = function() {
$cordovaDeviceOrientation.clearWatch($scope.watchId);
};
});
当我按下开始按钮时罗盘开始正常,并且在我旋转设备时更新{{dir}}值。我对clearWatch的调用什么也没做。
任何关于我做错的指针都将非常感激。
艾
答案 0 :(得分:1)
如果有人能解释我会感激,但我发现的是
$scope.watchId = $cordovaDeviceOrientation.watchHeading(options).then(...);
与
不同$scope.watchId = $cordovaDeviceOrientation.watchHeading(options);
查看了cordova插件和ngCordova的源代码后,我发现从watchHeading存储promise然后添加then()子句可以解决问题:
$scope.startCompass = function() {
var options = {
frequency: 500
};
$scope.watchPromise = $cordovaDeviceOrientation.watchHeading(options);
$scope.watchPromise.then(
null,
function(error) {
console.log(error);
},
function(result) {
$scope.dir = result.trueHeading;
}
);
};
$scope.stopCompass = function() {
$cordovaDeviceOrientation.clearWatch($scope.watchPromise.watchID);
};
答案 1 :(得分:1)
很抱歉,您的回答很晚,但是我现在遇到了同样的问题,希望对您有所帮助。 我认为那是因为在第一种情况下
$scope.watchId = $cordovaDeviceOrientation.watchHeading(options).then(customFunction);
$ scope.watchId接受customFunction的返回值,而不是watchHeading返回的promise 在第二种情况下
$scope.watchId = $cordovaDeviceOrientation.watchHeading(options);
$ scope.watchId将是watchHeading函数的返回诺言。 因此,通过在第一种情况下执行clearWatch,您将尝试清除自定义函数的可能返回值(该值仍可以是一个间隔,但这确实很少见),而在第二种情况下,您将清除正确的对象。 无论如何,我必须说我不太确定,但我仍然希望能对您有所帮助
Davide