2014-06-20 34 views
3

所以这真的很奇怪,也许它有一个我错过的简单答案。下面的代码给出了一个未知的提供程序错误:AngularJS:直到页面加载后才知道提供商?

var foo = angular.module('foo', [ 'ngRoute', 'ngAnimate', 'ngCookies' ]); 

foo.factory('fooApi', function ($scope, $http) { 
    var url = '/api/'; 

    var factory = {}; 

    factory.action = function (fields) { 
     fields.userid = $scope.userid; 
     fields.token = $scope.token; 

     console.log(JSON.stringify(fields)); 

     return $http.post(url, { data: fields }); 
    }; 

    return factory; 
}) 
.controller('loginController', function ($scope, fooApi) { 
    // do stuff 

}); 

在同一文件中这一切都装在一起,我觉得工厂是第一个将解决和喷油器将能够在下面引用时找到它。但它给出了一个未知的提供者错误。

但是,如果我注释掉控制器并等待页面加载,然后在Chrome JS控制台中执行完全相同的控制器声明,则它工作正常。

任何人都遇到过这种情况,并知道如何处理它?我无法在任何地方找到同样的问题。

+0

你可以试试:'foo.facotry(); foo.controller()'。基本上没有链接它们。看到注入工厂的'$ scope'也是有点奇怪的。我不确定这会工作(从未尝试过)。通常你会将范围或两个字段(userid,token)传递给函数。 – lucuma

+0

你可以显示你的'.html'是如何加载你所有的javascript文件的?我想知道如果你的应用程序的依赖项之一还没有加载...... – tennisgent

+5

你不能在工厂注入'$ scope'。应该给你'未知提供者:$ scopeProvider < - $ scope < - fooApi'。如果您将控制器注释掉,您将不会得到该错误,因为直到有人第一次请求时才会启动工厂。 – tasseKATT

回答

0

像@tasseKATT所说的,您不能将$scope注入服务,特别是factory。也许你的困惑是因为$scope可以注入控制器,所以你试图注入到factory

一个有趣的事情是,您看到注入到控制器中的$scope不是服务 - 就像其他可注入的东西 - ,而是一个Scope对象。

$scope的主要目的是视图和控制器之间的胶水之王,将$scope传递到服务中没有多大意义。

该服务只能访问$rootScope服务。

如果您需要将特定控制器的$scope传递给服务,则始终可以将其传递为服务中某个函数的参数。不推荐这种方法,因为开始打破SoC和单一责任原则,但可能适合你。

祝你好运:-)