Javascript 如何使用AngularJS和RequireJS从外部文件注入服务?

Javascript 如何使用AngularJS和RequireJS从外部文件注入服务?,javascript,angularjs,dependency-injection,requirejs,Javascript,Angularjs,Dependency Injection,Requirejs,我从外部文件注入控制器,我想从外部文件为服务做同样的事情。应在工厂报表中登记 控制器的工作原理 控制器 authCtrl 现在我想注入服务 服务 授权服务 当authController调用authService.login(…)时,它抛出错误错误:[$injector:undef]提供程序“authService”必须从$get factory方法返回一个值。 这段代码的灵感来自project。正如它所说,Angular的factory()将返回服务对象。你可能会有这样的运气: define(

我从外部文件注入控制器,我想从外部文件为服务做同样的事情。应在工厂报表中登记

控制器的工作原理

控制器

authCtrl

现在我想注入服务

服务

授权服务

当authController调用
authService.login(…)
时,它抛出错误
错误:[$injector:undef]提供程序“authService”必须从$get factory方法返回一个值。


这段代码的灵感来自project。

正如它所说,Angular的
factory()
将返回服务对象。你可能会有这样的运气:

define(['angular'], function (angular) {
    angular.module('vcApp.services', [])
    .factory('AuthService', ['$http', '$injector', function($http, $injector) {
        var stub = {};
        require(['auth/authService'], function(authService) {
            angular.extend(stub, $injector.invoke(authService, this, {'$http': $http}));
        });
        return stub;
    }]);
});
在这里,您为服务定义一个存根,并在服务实际延迟加载时对其进行扩展

(顺便说一下,
$injector.invoke()
的最后两个参数在本例中是多余的。)

如果您想了解关于混合RequireJS和Angular的另一个想法,这对延迟加载和r.js优化器很好,您可以看看

define([], function() {
    return ['$scope', '$routeParams', '$location', '$http', 'AuthService', function($scope, $routeParams, $location, $http, authService) {

        $scope.signIn = function() {
        ...
        }

        $scope.$apply();
    }];
});
'use strict';

define(['angular'], function (angular) {
    angular.module('vcApp.services', [])
    .factory('AuthService', ['$http', '$injector', function($http, $injector) {
        require(['auth/authService'], function(authService) {
            $injector.invoke(authService, this, {'$http': $http});
        });
    }]);
});
define([], function() {
    return ['$http', function ($http) {
        return {
            login: login
        };

        function login(username, password) {
            var request = $http(...);
            return(request);
        }
    }]
});
define(['angular'], function (angular) {
    angular.module('vcApp.services', [])
    .factory('AuthService', ['$http', '$injector', function($http, $injector) {
        var stub = {};
        require(['auth/authService'], function(authService) {
            angular.extend(stub, $injector.invoke(authService, this, {'$http': $http}));
        });
        return stub;
    }]);
});