我有以下angularjs服务:
angular.module('app.main').factory('MyService', ["$http", function ($http) {
return new function () {
this.GetName = function () {
return "MyName";
};
};
}]);
如何从旧版js代码中调用GetName
MyService
函数?
答案 0 :(得分:43)
使用angular.injector。使用您的代码,您可以执行以下操作:
angular.module('main.app', []).factory('MyService', ['$http', function ($http) {
return new function () {
this.GetName = function () {
return "MyName";
};
};
}]);
angular.injector(['ng', 'main.app']).get("MyService").GetName();
这是jsfiddle:http://jsfiddle.net/wGeNG/
注意 - 在加载自定义模块之前,您需要添加“ng”作为第一个模块,因为您的示例代码依赖于ng模块中的$ http提供程序。
编辑 - 在OP的回答中使用get()
但请注意,此代码在不依赖于绑定到应用模块“main”的元素的情况下获取服务的.app”。
答案 1 :(得分:15)
使用以下行有助于从angularjs服务执行我的方法:
angular.element('*[ng-app]').injector().get("MyService").GetName ();
答案 2 :(得分:15)
对我来说,它适用于:
angular.element(document.body).injector().get("MyService")
我得到了“未知提供商”#39;尝试这个时出错:
angular.injector(['ng', 'main.app']).get("MyService")
当我使用jqLite时,我无法做到
angular.element('*[ng-app]')
因为jqLite不支持选择器,但我得到了[Dor Cohen]的想法。我的指令ng-app在我的身体标签上,然后我可以使用:
angular.element(document.body).injector().get("MyService")
或
angular.element(document).find('body').injector().get("MyService")
答案 3 :(得分:0)
这是我使用的实用方法:
private boolean isAuthListenerSet = false;
private FirebaseAuth.AuthStateListener mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
//User is signed in
} else {
//User is signed out - insert your logic here
}
}
};
@Override
protected void onStart() {
super.onStart();
if (!isAuthListenerSet) {
FirebaseAuth.getInstance().addAuthStateListener(mAuthListener);
isAuthListenerSet = true;
}
}
@Override
protected void onStop() {
super.onStop();
if (mAuthListener != null) {
FirebaseAuth.getInstance().removeAuthStateListener(mAuthListener);
isAuthListenerSet = false;
}
}
function getService(name, element) {
element = element || '*[ng-app]';
return angular.element(element).injector().get(name);
}
体)