2015-04-23 38 views
1

我正在開發一個Cordova/PhoneGap應用程序,並且我使用$ cordovaPush插件(用於封裝PushPlugin)來處理推送通知。集成非Angular代碼?

的代碼看起來是這樣的:

var androidConfig = { 
        "senderID" : "mysenderID", 
        "ecb"  : "onNotification" 
       } 

       $cordovaPush.register(androidConfig).then(function(result) { 
        console.log('Cordova Push Reg Success'); 
        console.log(result);    
       }, function(error) { 
        console.log('Cordova push reg error'); 
        console.log(error); 
       }); 

的 「ECB」 功能必須與窗口範圍被定義,即:

window.onNotification = function onNotification(e)... 

這個函數處理傳入的事件。我很明顯喜歡在我的角碼中處理傳入事件 - 我如何集成這兩個函數以便我的onNotification函數可以訪問我的scope/rootScope變量?

回答

0

定義一種郵件控制器在身體內部,該控制器使用$window服務。

HTML:

<body ng-controller="MainController"> 
    <!-- other markup .--> 
</body> 

JS:

yourApp.controller("BaseController", ["$scope", "$window", function($scope, $window) { 

    $window.onNotification = function(e) { 
     // Use $scope or any Angular stuff 
    } 
}]); 
1

通常情況下,你會換你的第三方庫的servicefactory,但在回答您的特定方案的精神..

以下是一種可能性:

angular.module('myApp'). 
    controller('myController', function($scope, $window) { 
    $window.onNotification = function() { 
     $scope.apply(function() { 
     $scope.myVar = ...updates... 
     }); 
    }; 
    }); 

幾件事情需要注意:

  • 嘗試使用$window,不window。這是一個很好的習慣,因爲它可以幫助你降低可測試性。由於科爾多瓦的內部,你可能實際上需要使用window,但我懷疑它。
  • 完成所有工作的功能都埋在$scope.apply之內。 如果您忘記執行此操作,則更新的任何變量將不會反映在視圖中,直到摘要循環再次運行(如果曾經)。
  • 雖然我把我的例子放在一個控制器中,你可能會把你的例子放在一個處理程序中。如果它的角度處理函數(例如ng-click),您可能會認爲因爲ng-click隱式的$ apply包裝了回調函數,所以您的onNotification函數此時不會被調用,所以您仍然需要執行$apply,如上所述。
  • ......認真...不要忘記適用。 :-)當我調試人們的代碼時,這是外部庫不工作的首要原因。我們都至少有一次這樣做。