【问题标题】:Call angularjs service from simple js code从简单的 js 代码调用 angularjs 服务
【发布时间】:2013-06-23 13:48:26
【问题描述】:

我有以下 angularjs 服务:

angular.module('app.main').factory('MyService', ["$http", function ($http) {
    return new function () {

        this.GetName = function () {
            return "MyName";
        };
    };
}]);

如何从旧版 js 代码中的 MyService 调用 GetName 函数?

【问题讨论】:

    标签: javascript angularjs angularjs-service


    【解决方案1】:

    使用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 提供程序。

    EDIT - 在 OP 的回答中使用get() 请注意,此代码正在获取服务,而不依赖于绑定到应用模块“main.app”的元素”。

    【讨论】:

    • 哦,是的,我真的需要这个。谢谢,为你点赞:D
    • 一句警告:对我来说,这个解决方案没有 100% 有效,因为我的服务试图获取在 ng-template 元素中定义的模板但未能这样做(没有找到)。然而,@DorCohen 提出的解决方案在这种情况下也非常有效。
    • "angular.injector 创建一个新的注入器函数,它不返回与引导应用程序关联的注入器函数。"如here 所述。即,它将为您的服务注入新的$rootScope
    • 如果myservice调用其他服务,如何获取Myservice?
    • 在我的例子中,工厂返回了一个函数(不是 new 函数),所以它看起来更像这样:angular.injector(['ng', 'main.app']).get("MyService")()
    【解决方案2】:

    使用以下行有助于从 angularjs 服务执行我的方法:

    angular.element('*[ng-app]').injector().get("MyService").GetName ();
    

    【讨论】:

    • 这个解决方案对我不起作用,但下面的解决方案对我有用。
    【解决方案3】:

    对我来说,它适用于:

    angular.element(document.body).injector().get("MyService")
    

    尝试此操作时出现“未知提供者”错误:

    angular.injector(['ng', 'main.app']).get("MyService")
    

    因为我正在使用 jqLit​​e,所以我不能这样做

    angular.element('*[ng-app]')
    

    因为 jqLit​​e 不支持选择器,但我得到了 [Dor Cohen] 的想法。我的指令 ng-app 在我的 body 标签上,然后我可以使用:

    angular.element(document.body).injector().get("MyService")
    

    angular.element(document).find('body').injector().get("MyService")
    

    【讨论】:

    • 接受的答案对我不起作用,但这个答案对我有用。 +1
    【解决方案4】:

    这是我使用的一个实用方法:

    function getService(name, element) {
        element = element || '*[ng-app]';
        return angular.element(element).injector().get(name);
    }
    

    getSrv("name-of_service", document.body)

    【讨论】:

      猜你喜欢
      • 2017-03-19
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2013-12-03
      相关资源
      最近更新 更多