[英]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.