Ionic $ cordovaDeviceOrientation.clearWatch()不起作用

时间:2015-04-03 11:05:24

标签: angularjs cordova ionic

我有一个创造指南针的离子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的调用什么也没做。

任何关于我做错的指针都将非常感激。

2 个答案:

答案 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