这个工厂依赖问题出了什么问题?

时间:2015-06-11 07:56:31

标签: javascript angularjs dependency-injection factory

我正在使用AngularJS。 我想让一个控制器使用第一个使用另一个工厂的工厂。

它可以是那样的模式:

MyCtrl -> Factory1 -> Factory2 

所以我尝试用3个不同的文件(按以下顺序加载):

Factory2.js

app.factory('Factory2', function () { ... })

Factory1.js

app.factory('Factory1',['Factory2', function (Factory2) { ... })

controller.js

app.controller('MyCtrl',['$scope', 'Factory1', function ($scope, Factory1) { ... })

在我的HTML中,我有:

<script src="services/factory2.js" type="text/javascript"></script>  
<script src="services/factory1.js" type="text/javascript"></script>
<script src="controllers/controller.js" type="text/javascript"></script>

但它不起作用,我有这个错误Unknown provider: Factory2Provider <- Factory2 <- Factory1

我的代码出了什么问题?我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

您可以重构代码并使用模块,这样您就不需要使用$ inject

var app = angular.module('app', ['factories', 'mymodule']);

angular.module('factories', [])
    .factory('Factory2', function () { })
    .factory('Factory1', ['Factory2', function (Factory2) {
         return myCustomFunction = function () {
             alert('todo');
         }
    }]);

angular.module('mymodule', [])
    .controller('MyCtrl', ['$scope', 'Factory1', function ($scope, Factory1) {
    $scope.text = "testing";
}])

http://jsfiddle.net/kL78rdr3/3/

答案 1 :(得分:0)

为什么不使用 $ inject 进行显式注入?这是一种更好的方法,因为它可以让您更好地控制依赖关系。例如:

userController.js

function userController (model, routeParams, searchService) {
    //implementation
}
userController.$inject = ['$scope', '$routeParams', 'searchService'];
app.controller("userController", userController);

searchService.js

var searchService = function (http, log) {
    //implementation
}
searchService.$inject = ["$http", "$log"];
app.factory("searchService", searchService);

这篇文章可能有用:Explicit Dependency Injection