Angular注入`false`而不是我请求的服务

时间:2015-10-29 11:58:47

标签: angularjs dependency-injection coffeescript

我有一个像这样定义的控制器:

angular.module('myApp')
  .controller 'DetailController', ($rootScope, $scope, $routeParams, apiService) ->
    onStart = () ->
      getData()
      getOtherData()

    # a bunch of other functions defined here

    getData = ->
      apiService.get('/detail/' + $routeParams.id).then (result) ->
        $scope.data = result.data # really a little bit more involved :)

    onStart()

这很有效。

现在,我想在otherService函数中使用一些getData()来做额外的事情。我们假设otherService被定义为

angular.module('myApp')
  .factory 'otherService', () ->
    doTheThing = -> console.log('did the thing!')

    {
      doTheThing
    }

(这适用于应用程序的其他部分)。

要在我的控制器中使用它,我这样做:

angular.module('myApp')
  .controller 'DetailController', ($rootScope, $scope, $routeParams, apiService, otherService) ->
    onStart = () ->
      getData()
      getOtherData()

    # a bunch of other functions defined here

    getData = ->
      apiService.get('/detail/' + $routeParams.id).then (result) ->
        $scope.data = result.data # really a little bit more involved :)
        otherService.doTheThing()

    onStart()

即。在参数列表的末尾添加一个参数otherService,然后使用它。

这为我TypeError提供了doTheThing因为otherService未定义。调试时,我发现false包含值{{1}}而不是我请求的服务。

为什么?

1 个答案:

答案 0 :(得分:1)

我不太喜欢Coffeescript,但是当我使用以下代码转换代码时:尝试Coffeescript(http://coffeescript.org/),我得到了:

angular.module('myApp').factory('otherService', function() {
  var doTheThing;
  doTheThing = function() {
    return console.log('did the thing!');
  };
  return {
    doTheThing: doTheThing
  };
});

angular.module('myApp').controller('DetailController', function($rootScope, $scope, $routeParams, apiService, otherService) {
  var getData, onStart;
  onStart = function() {
    getData();
    return getOtherData();
  };
  getData = function() {
    return apiService.get('/detail/' + $routeParams.id).then(function(result) {
      $scope.data = result.data;
      return otherService.doTheThing();
    });
  };
  return onStart();
});

我不确定是否返回onStart - 因为Controller应该是普通的构造函数,但不要介意我尝试使用jsbin并删除$ q.when的未满足的依赖项并且它可以工作。

http://jsbin.com/cubekojuwu/edit?js,console,output

关于工厂的主要事情是它应该返回应放入DI容器的对象,并且您的代码看起来不错。 所以我认为你的问题出现在我们无法看到的地方。

你能提供完整的"不工作" jsbin?您可以将已编译的代码放入其中。