我有一個使用推送通知的應用科爾多瓦(仍在使用舊插件:-()觸發操作
應用程序使用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()
被稱爲多次(不知道爲什麼),它是一種意大利麪代碼。
我的問題是 - 我應該如何以清晰和有效的方式實施類似的東西?提醒一下,應用程序可能是「冷啓動」或在後臺,我需要知道它何時「正在運行」(或控制器已準備就緒)。