Javascript 如何在混合应用程序中的角度控制器内注册cordova事件
我使用VisualStudio:Type Script > CordoVA应用程序来构建应用程序的基础。然后我安装angularJs 1.3,它是移动angular ui所需要的,然后安装它 应用程序有index.ts,稍后它的比较结果将放在appBundle.js中 文件如下所示,工作正常:Javascript 如何在混合应用程序中的角度控制器内注册cordova事件,javascript,android,angularjs,cordova,mobile-angular-ui,Javascript,Android,Angularjs,Cordova,Mobile Angular Ui,我使用VisualStudio:Type Script > CordoVA应用程序来构建应用程序的基础。然后我安装angularJs 1.3,它是移动angular ui所需要的,然后安装它 应用程序有index.ts,稍后它的比较结果将放在appBundle.js中 文件如下所示,工作正常: // For an introduction to the Blank template, see the following documentation: // http://go.microsoft.
// For an introduction to the Blank template, see the following documentation:
// http://go.microsoft.com/fwlink/?LinkID=397705
// To debug code on page load in Ripple or on Android devices/emulators: launch your app, set breakpoints,
// and then run "window.location.reload()" in the JavaScript Console.
var RavisMobileCordova;
(function (RavisMobileCordova) {
"use strict";
var Application;
(function (Application) {
function initialize() {
document.addEventListener('deviceready', onDeviceReady, false);
}
Application.initialize = initialize;
function onDeviceReady() {
// Handle the Cordova pause and resume events
document.addEventListener('pause', onPause, false);
document.addEventListener('resume', onResume, false);
// TODO: Cordova has been loaded. Perform any initialization that requires Cordova here.
}
function onPause() {
// TODO: This application has been suspended. Save application state here.
}
function onResume() {
// TODO: This application has been reactivated. Restore application state here.
}
})(Application = RavisMobileCordova.Application || (RavisMobileCordova.Application = {}));
window.onload = function () {
Application.initialize();
};
})(RavisMobileCordova || (RavisMobileCordova = {}));
//# sourceMappingURL=appBundle.js.map
但是,当它到达阶段时,我可能需要在我的控制器内调用一个事件,我不能这样做,调试器分离并且没有显示任何帮助完整错误
我使用onResume for test propose进行了尝试,首先看到:
以及更换线路:
document.addEventListener('resume', onResume, false);
使用以下命令,并定义$scope.onResume=function。。。在我的控制器中:
document.addEventListener('resume', $scope.onResume, false);
//Only Device Ready Here
document.addEventListener('deviceready', $scope.DeviceEvents.onDeviceReady, false);
$scope.DeviceEvents={
onDeviceReady: function(){
//Register Device Events Here
document.addEventListener('resume', $scope.DeviceEvents.onResume, false);
},
onResume:function(){
alert("resuming!!!");
}
};
var eventList = {};
$scope.SystemMethods = {
RegisterEvent: function(eventType, callBack) {
if (Utility.isNullOrUndefined(eventList[eventType]))
eventList[eventType] = [];
eventList[eventType].push({ eventType: eventType, callBack: callBack });
},
UnregisterEvent: function(eventType, callBack) {
var delList = Enumerable.From(eventList[eventType]).Where(function (w) {
return w.eventType === eventType && w.callBack === callBack;
}).ToArray();
for (var i = 0; i < delList.length; i++) {
var objIndex = Enumerable.From(eventList[eventType]).IndexOf(delList[i]);
eventList[eventType].splice(objIndex, 1);
}
}
}
失败了强>
然后我在自己的控制器中完成了document.addEventListener(…)
失败了强>
然后,我仔细查看appBundle.js,发现在调用device ready时是否在resume上注册,所以我在控制器主体中执行了以下操作:
document.addEventListener('resume', $scope.onResume, false);
//Only Device Ready Here
document.addEventListener('deviceready', $scope.DeviceEvents.onDeviceReady, false);
$scope.DeviceEvents={
onDeviceReady: function(){
//Register Device Events Here
document.addEventListener('resume', $scope.DeviceEvents.onResume, false);
},
onResume:function(){
alert("resuming!!!");
}
};
var eventList = {};
$scope.SystemMethods = {
RegisterEvent: function(eventType, callBack) {
if (Utility.isNullOrUndefined(eventList[eventType]))
eventList[eventType] = [];
eventList[eventType].push({ eventType: eventType, callBack: callBack });
},
UnregisterEvent: function(eventType, callBack) {
var delList = Enumerable.From(eventList[eventType]).Where(function (w) {
return w.eventType === eventType && w.callBack === callBack;
}).ToArray();
for (var i = 0; i < delList.length; i++) {
var objIndex = Enumerable.From(eventList[eventType]).IndexOf(delList[i]);
eventList[eventType].splice(objIndex, 1);
}
}
}
再一次
失败了强>
现在,有人知道我应该如何通过移动用户界面来实现吗?如何在应用程序中注册来自设备的任何类型的事件
如果我在任何地方都错了,对不起,我对所有这些东西都是新手,Android,Cordova,知道Angular的基本知识。。。有人的老板让他写一份申请书,说我对其中的任何部分都不熟悉
谢谢,,
哈桑F
编辑 我刚才也发现了这个,它被用在了角度上,但它仍然和控制器没有任何关系 run(函数($rootScope、$http、dataService、$window、$q、$location、localize){ 文件。添加的监听器(“deviceready”,OnDeviceraddy,false) 函数ondevicerady(){ }
}以下是我所做的……首先,我从HTML中删除了ng应用程序 然后我注册onDeviceReady事件,在该事件中,我将ng应用程序附加到我的html中,所以在设备准备就绪后,angular将启动它的进程 第二,我有多层结构,这意味着,我有一个母版页,它位于HTML标记上,其他控制器在其中,使用ng视图和路由配置 因此,我将事件绑定到主控制器:
document.addEventListener('resume', $scope.onResume, false);
//Only Device Ready Here
document.addEventListener('deviceready', $scope.DeviceEvents.onDeviceReady, false);
$scope.DeviceEvents={
onDeviceReady: function(){
//Register Device Events Here
document.addEventListener('resume', $scope.DeviceEvents.onResume, false);
},
onResume:function(){
alert("resuming!!!");
}
};
var eventList = {};
$scope.SystemMethods = {
RegisterEvent: function(eventType, callBack) {
if (Utility.isNullOrUndefined(eventList[eventType]))
eventList[eventType] = [];
eventList[eventType].push({ eventType: eventType, callBack: callBack });
},
UnregisterEvent: function(eventType, callBack) {
var delList = Enumerable.From(eventList[eventType]).Where(function (w) {
return w.eventType === eventType && w.callBack === callBack;
}).ToArray();
for (var i = 0; i < delList.length; i++) {
var objIndex = Enumerable.From(eventList[eventType]).IndexOf(delList[i]);
eventList[eventType].splice(objIndex, 1);
}
}
}
像这样:
module RavisMobileCordova {
export module Application {
export function initialize() {
var matchesDevice = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|IEMobile)/);
isBrowser = !(matchesDevice!=null && matchesDevice.length > 0);
document.addEventListener("deviceready", onDeviceReady, false);
if (isBrowser) {
// Create the event
var event = new CustomEvent("deviceready", {});
// Dispatch/Trigger/Fire the event
document.dispatchEvent(event);
}
}
function onDeviceReady(evt) {
angular.element(document).ready(() => {
var domElement = document.getElementById("appElement");
angular.bootstrap(domElement, ["ravisMobileApp"]);
});
// Handle the Cordova pause and resume events
//TRUE: Capture Phase, FALSE: Bubbling Phase
document.addEventListener("pause", onPause, false);
document.addEventListener("resume", onResume, false);
document.addEventListener("backbutton", onBackButton, true);
document.addEventListener("offline", onOffline, false);
document.addEventListener("online", onOnline, false);
// TODO: Cordova has been loaded. Perform any initialization that requires Cordova here.
var scope:any = angular.element("[ng-controller='MasterController'], [data-ng-controller='MasterController']").scope();
scope.SystemApi.Navigator = navigator;
scope.SystemEvents.OnStart(evt);
}
function onPause() {
// TODO: This application has been suspended. Save application state here.
}
function onResume() {
// TODO: This application has been reactivated. Restore application state here.
}
function onBackButton(evt) {
//evt.preventDefault();
//evt.stopPropagation();
var scope:any = angular.element("[ng-controller='MasterController'], [data-ng-controller='MasterController']").scope();
scope.SystemEvents.BackButton(evt);
}
function onOffline() {
var scope: any = angular.element("[ng-controller='MasterController'], [data-ng-controller='MasterController']").scope();
scope.SystemEvents.OnOffline();
}
function onOnline() {
var scope: any = angular.element("[ng-controller='MasterController'], [data-ng-controller='MasterController']").scope();
scope.SystemEvents.OnOnline();
}
}
window.onload = () => {
Application.initialize();
}
}
然后我在我的主控制器中定义这个部分,它在registerd事件中被调用
$scope.SystemEvents = {
OnStart: function () {
LocalStorageService.NavigatorHistory.clearHistory();
angular.element("#master_overlay").removeAttr("style");
if ($scope.SystemMethods.IsNetworkOffline()) {
//$scope.SystemEvents.OnOffline();
// Create the event
var event = new CustomEvent("offline", {});
// Dispatch/Trigger/Fire the event
document.dispatchEvent(event);
}
},
OnOnline: function () {
if (!Utility.isNullOrUndefined(eventList[EventTypes.Online])) {
for (var i = 0; i < eventList[EventTypes.Online].length; i++) {
eventList[EventTypes.Online][i].callBack();
}
}
$scope.SystemMethods.HideMasterOverlay();
},
OnOffline: function() {
if (!Utility.isNullOrUndefined(eventList[EventTypes.Offline])) {
for (var i = 0; i < eventList[EventTypes.Offline].length; i++) {
eventList[EventTypes.Offline][i].callBack();
}
}
$scope.SystemMethods.ShowMasterOverlay();
},
BackButton: function (evt) {
//Bind Cancel
evt.cancel = false;
//Call All Registered Events
if (!Utility.isNullOrUndefined(eventList[EventTypes.BackButton])) {
for (var i = 0; i < eventList[EventTypes.BackButton].length; i++) {
eventList[EventTypes.BackButton][i].callBack(evt);
}
}
//If Cancel Do Return
if (evt.cancel)
return;
//TODO: API Cancelable Code Here
$scope.SystemMethods.MoveToPreviousPage();
//evt.preventDefault();
//evt.stopPropagation();
},
HistoryBack: $scope.SystemMethods.MoveToPreviousPage
};