直接调用 AngularJS 工厂实例化的对象

Direct call to objects instantiated by factory on AngularJS

考虑到下面的模块,如何在不依赖AngularJS依赖注入的情况下直接调用RESTService.get

angular.module('RESTModule', ['ngResource']).
  factory('RESTService', ['$resource', function($resource) {
      return $resource('http://jsonplaceholder.typicode.com/posts/1', {});
    }
  ]);

我希望能够创建一个如下所示的库方法,直接调用工厂创建的对象,但是factory()没有像我预期的那样工作。

var MyLibrary = {};
MyLibrary.method = function() {
  // ...
  // The line below miserably fails... :-(
  angular.module('RESTModule').factory('RESTService').get();
};

我可能做错了,应该考虑编写一个 AngularJS 服务……但由于我坚持不懈,我决定寻求您的帮助。

谢谢!

旁注:我正在编写一个应用程序,允许开发人员在上面包含他们自己的表单(视图),以及他们自己的模块来控制这些视图(我到目前为止做得很好)。

但我不想强制他们在自己的代码中注入模块(如 RESTModule),而是让他们调用“静态”库方法(如 MYLibrary.method)。

有一个事实。您的方法需要 $resource 才能正常工作。 如果您使用 via Angular,它会为您注入该依赖项并且 $resource 不会未定义。

如果您想直接调用该方法,请将该方法分配给一个 var 并使用您自己的 $resource 对象调用它。

var factoryMethod=function($resource) {
      return $resource('http://jsonplaceholder.typicode.com/posts/1', {});
    };
angular.module('RESTModule', ['ngResource']).
  factory('RESTService', ['$resource', factoryMethod]);
// factoryMethod(<your object>); will work

我并没有真正了解有关动态用户给定表单的详细信息。但是方法可以正常调用

angular.element(document.querySelector('*[ng-app]')).injector().get('RESTService');

应该可以完成这项工作,但您必须确保 angular 已加载并完成依赖注入,如下所示:

var restService;
var timer = setTimeout(function(){ 
    if(angular && 
        angular.element(document.querySelector('*[ng-app]')).injector())
    {
        clearTimeout(timer);
        restService = angular.element(document.querySelector('*[ng-app]')).injector().get('RESTService');
    }}, 1000);