Javascript 如何在混合应用程序中的角度控制器内注册cordova事件

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.

我使用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.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
    };