2016-11-16 86 views
0

我有一個使用推送通知的應用科爾多瓦(仍在使用舊插件:-()觸發操作

應用程序使用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()被稱爲多次(不知道爲什麼),它是一種意大利麪代碼。

我的問題是 - 我應該如何以清晰和有效的方式實施類似的東西?提醒一下,應用程序可能是「冷啓動」或在後臺,我需要知道它何時「正在運行」(或控制器已準備就緒)。

回答

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實現。儘管它對冷啓動和應用程序在後臺都有效,但我認爲它應該不是健壯的。

不過,我不會將此解決方案標記爲「答案」。另一方面,在沒有適當的狀態路由的情況下,可能沒有太多的工作要做。