繁体   English   中英

通过推送通知触发操作

[英]Trigger Action from 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 ,如果设置了标志,则广播“打开”对话框”事件(并删除该标志)。 按照这种方法,我不确定如何触发“已加载”事件,因此我使用标记中的函数:

在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()被多次调用(不确定为什么),这是一种意粉代码。

我的问题是-我应该如何以清晰有效的方式实施类似的工作? 提醒一下,该应用程序可能是“冷启动”的,也可能是在后台运行的,我需要知道它何时“正在运行”(或控制器已准备就绪)。

我发现了一个稍微更健壮,基于超时的实现(仍然不完全是我想要的)。

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

在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();
});

按我的喜好,这仍然是一个不错的实现。 即使它确实适用于冷启动以及当应用程序在后台运行时,我都认为它不如应有的健壮性。

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

另一方面,如果没有适当的状态路由,那么可能要做的事情就不多了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM