触发操作
我有一个使用推送通知的应用科尔多瓦(仍在使用旧插件:-()触发操作
应用程序使用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();
});
这对我来说仍然是一个iff-y实现。尽管它对冷启动和应用程序在后台都有效,但我认为它应该不是健壮的。
不过,我不会将此解决方案标记为“答案”。另一方面,在没有适当的状态路由的情况下,可能没有太多的工作要做。