我正在尝试将rootScope用作全局,以便可以在控制器中检索它。
app.js:
angular.module('app', ['ionic', 'app.controllers', 'app.routes', 'app.services', 'app.directives'])
.run(function($ionicPlatform,$rootScope) {
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
cordova.plugins.Keyboard.disableScroll(true);
}
if (window.StatusBar) {
// org.apache.cordova.statusbar required
StatusBar.styleDefault();
}
pushNotification = window.plugins.pushNotification;
pushNotification.register(
onNotification,
errorHandler,
{
'badge': 'true',
'sound': 'true',
'alert': 'true',
'ecb': 'onNotification',
'senderID': '999999999999',
}
);
});
})
window.onNotification = function(e){
switch(e.event){
case 'registered':
if(e.regid.length > 0){
var device_token = e.regid;
alert('registered :'+device_token);
$rootScope.devicetoken = device_token;
}
break;
case 'message':
alert('msg received: ' + e.message);
break;
case 'error':
alert('error occured');
break;
}
};
window.errorHandler = function(error){
alert('an error occured');
}
我正在获取device_token并进入警戒状态。但它不会进入rootScope内部以在控制器中使用它。
Controller.js:
angular.module('app.controllers', [])
.controller('onWalletWelcomesCtrl', function($scope, $ionicModal,User,$ionicLoading,$rootScope) {
$ionicModal.fromTemplateUrl('signup-modal.html', {
id: '1', // We need to use and ID to identify the modal that is firing the event!
scope: $scope,
backdropClickToClose: false,
animation: 'slide-in-up'
}).then(function(modal) {
$scope.oModal1 = modal;
});
$scope.proceed = function(){
alert($rootScope.devicetoken);
$ionicLoading.show({template: '<ion-spinner icon="android"></ion-spinner>'});
}
})
我在提交函数中发出警报时未定义。 我应该如何在window.onNotification中使用rootScope。我的主要目的是将devicetoken传递给控制器。请让我分享变量的最佳做法。
angular.module('app', ['ionic', 'app.controllers', 'app.routes', 'app.services', 'app.directives'])
.run(function($ionicPlatform,$rootScope) {
$ionicPlatform.ready(function() {
if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
cordova.plugins.Keyboard.disableScroll(true);
}
if (window.StatusBar) {
// org.apache.cordova.statusbar required
StatusBar.styleDefault();
}
pushNotification = window.plugins.pushNotification;
pushNotification.register(
onNotification,
errorHandler,
{
'badge': 'true',
'sound': 'true',
'alert': 'true',
'ecb': 'onNotification',
'senderID': '9999999999',
}
);
});
})
window.onNotification = function(e){
switch(e.event){
case 'registered':
if(e.regid.length > 0){
var device_token = e.regid;
alert('registered :'+device_token);
$rootScope.devicetoken = "hi";
$scope.$apply();
}
break;
case 'message':
alert('msg received: ' + e.message);
break;
case 'error':
alert('error occured');
break;
}
};
window.errorHandler = function(error){
alert('an error occured');
}
在控制器发出警报时,我仍然未定义。
答案 0 :(得分:0)
您需要在window.onNotification = function(e){..}
阻止内移动.run(function($ionicPlatform,$rootScope) {...}
声明。
$ rootScope将在您当前放置的onNotification处理程序中未定义 - 您需要在run()块内声明onNotification处理程序,以便在定义时可以访问rootScope对象。
另外,因为您将使用一个生活在角度生命周期之外的事件处理程序更新rootScope(角度不知道它),您需要手动调用触发新的摘要周期。在通知处理程序中,您需要使用$ rootScope.apply()包装$rootScope.devicetoken = device_token;
行,以便它看起来像这样:
$rootScope.apply(function(){
$rootScope.devicetoken = device_token;
});
答案 1 :(得分:0)
您在window.onNotification
中使用$ rootScope,因此它不是角度上下文,因此您需要告诉angular进行更新。
因此,您需要在$scope.$apply();
更新后添加$rootScope
。
答案 2 :(得分:-1)
尝试在运行范围
上定义$ rootScope.devicetoken.run(function($ionicPlatform,$rootScope) {
$rootScope.devicetoken = '';
确保在$ scope.proceed
之前执行window.onNotification