gpt4 book ai didi

javascript - 全局函数中的 Angular.js 依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-29 16:11:24 24 4
gpt4 key购买 nike

我正在使用 angular.js 编写一个 cordova 应用程序。当我使用 PushPlugin 向用户发送推送通知时。我已经像这样注册了用户电话:

var pushNotification = window.plugins.pushNotification;
pushNotification.register(successHandler, errorHandler, { "senderID": [gmc_project_number], "ecb": "app.onNotificationGCM" });

我传递的最后一个参数是 app.onNotificationGCM,这是一个在我收到通知时调用的函数。

这是该函数的实现:

 app.onNotificationGCM = function (e) {
switch (e.event) {
case 'registered':
if (e.regid.length > 0) {
console.log("Regid " + e.regid);
alert('registration id = ' + e.regid);
}
break;

case 'message':
// this is the actual push notification. its format depends on the data model from the push server
alert('message = ' + e.message + ' msgcnt = ' + e.msgcnt);
break;

case 'error':
alert('GCM error = ' + e.msg);
break;

default:
alert('An unknown GCM event has occurred');
break;
}
};

我必须将它添加到全局变量(在本例中为 angular.module)中,以便在返回响应时可以访问它。

这是我从https://github.com/phonegap-build/PushPlugin/issues/309得到的解释

Because the Android JAVA code calls a function (I saw it in the LogCat) called sendJavascript() this function contain a string that contain the function onNotificationGCM(Json) that is called in the document so if you load the function in the "onDeviceReady" it will be avalaible only when the device is ready and not always like is supposed to be (the registrration takes a few seconds to come back)

就目前而言,它工作得很好。问题是我想调用工厂并在 onNotificationGCM 中从它进行 http 调用。目前我不知道如何注入(inject)工厂。我尝试将 onNotificationGCM 函数分配给 $rootScope 但无法在响应中访问它。

有没有办法在这个全局函数中注入(inject)一个工厂?是否有另一种方法来实现它,也许在 app.config() 中?

最佳答案

如果你有一个 Angular $injector ( ref ) 对于您的应用程序,您可以使用依赖注入(inject)轻松调用函数:

$injector.invoke(["$http", myfunction]);

例如,您可以将整个函数包装为:

app.onNotificationGCM = function (e) {
$injector.invoke(["$http", function($http) {
// your code here... it will be dependency injected by Angular
}]);
};

您绝对想调用 $apply() - $http调用之前不会运行,所以实际上代码应该是:

app.onNotificationGCM = function (e) {
$injector.invoke(["$http", "$rootScope", function($http, $rootScope) {
$rootScope.$apply(function() {
// your code here... it will be dependency injected by Angular
// ... AND called properly in a digest cycle
});
}]);
};

这只是第一部分。现在的问题是如何获得正确的 $injector适合您的应用程序?

如果您手动引导,则 angular.bootstrap ( ref ) 返回注入(inject)器。只需将其保存在(全局?)变量中即可。

您可能使用 ng-app .然后您将必须识别包含 ng-app 的元素以某种方式调用angular.element.injector (ref - 寻找“jQuery/jqLit​​e Extras”)。例如,如果 ng-app<body> :

// in code OUTSIDE Angular
var $injector = angular.element(document.body).injector();

关于javascript - 全局函数中的 Angular.js 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26628619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com