推送通知中的触发操作

时间:2016-11-16 16:48:21

标签: javascript angularjs cordova push-notification

我有一个使用推送通知的cordova应用程序(仍使用旧插件:-()。

应用程序使用ngRouter并且导航是相对基础的 - 我的意思是我的主菜单更改ngView但弹出窗口/模态不是导航的一部分,并且由某些绑定控制器属性或通过调用控制器触发功能(例如$scope.openMyModal)。

我正在尝试能够在收到推送通知(并且加载控制器)后在我的一个控制器上调用此类功能。

我使用超时来实现一些代码来广播一个应该在相关控制器中捕获并打开模态的事件。代码大致是:

在app.js中:

onNotification() {
   // some code for determining the type of notification
   // then
   setTimeout(function() {
       $rootScope.$broadcast("someEventCode");
   }, 10); // or 1000 in case of cold start
}

在MyController.js中:

.controller('MyController', function($scope, $rootScope, $modal,...) {
    $scope.openMyModal = function() { // open modal using $model }

    $scope.on("someEventCode", function() {
        $scope.openMyModal();
    });
}

这种作品但不一致/确定。例如,在较慢的设备中,它可以在控制器准备好响应之前进行广播。

我还尝试在根范围上设置一些变量(在onNotification中)并在控制器中创建一个从标记中调用的函数(例如{{isNotificationReady()}}),但这也没有工作得很好。

另一种方法是使用双重通知 - 在通知到达时在根作用域中设置标志,等待来自目标控制器的事件(指示它已加载)然后再次在$rootScope,如果标志是设置,播放"打开对话框" event(并删除标志)。按照这种方法,我不知道如何触发"加载"事件所以我使用标记中的函数:

在MyController.js中:

$scope.isLoaded = function() {
    $scope.$emit("myControllerLoaded");
}

在标记中:

<div><!-- the content --></div>
{{isLoaded()}}

在app.js

$rootScope.$on("myControllerLoaded", function(event) {
    if ($rootScope.notification === "someEventCode") {
        $rootScope.$broadcast("openTheModel");
        delete $rootScope.notification;
    }
});

这似乎是繁琐且低效的代码。多次调用isLoaded()(不确定原因),它是一种意大利面条代码。

我的问题是 - 我应该如何以清晰有效的方式实现类似的东西?只是提醒一下,该应用程序可以“冷启动”#34;或者在后台,我需要知道它何时运行&#34; (或控制器准备就绪)。

1 个答案:

答案 0 :(得分:0)

我发现了一个稍微强一些,基于超时的实现(仍然不是我希望的那样)。

想法是设置一个标志并在一段时间后发送(广播)信号。然后按间隔重新发送信号,直到目标控制器取消设置标志:

在app.js

function broadcastSomeEvent() {
    $rootScope.$broadcast("someEventCode");
    if ($rootScope.eventFlag) {
        setTimeout(broadcastSomeEvent, 50);
    }
}


onNotification() {
   // some code for determining the type of notification, then
   $rootScope.eventFlag = true;
   setTimeout(broadcastSomeEvent, 10); // or 1000 in case of cold start
}

在MyController.js

$scope.$on('someEventCode', function() {
    delete $rootScope.eventFlag;  // delete flag so event is stopped
    $scope.openMyModal();
});

根据我的口味,这仍然是一个iff-y实现。虽然它确实适用于冷启动和应用程序在后台运行,但我相信它并不像应该的那样强大。

不过,我不会将此解决方案标记为“答案”。

另一方面,由于没有适当的状态路由,也许没有比可以做的更多。