2013-03-12 60 views
0

为什么readingController无法使用Romanize服务?它总是说Romanize在函数内部是未定义的。我如何获得范围内的服务?为什么我的工厂没有被实例化/注入?

var readingController = function (scope, Romanize){ 
    scope.currentMaterial = scope.sections[scope.sectionNumber].tutorials[scope.tutorialNumber].material; 
    Romanize; 
} 

var app = angular.module('Tutorials', ['functions', 'tutorials']).controller('getAnswers', function ($scope, $element) { 
    $scope.sectionNumber = 0; 
    $scope.tutorialNumber = 0; 
    $scope.questionNumber = 0; 
    $scope.sections = sections; 
    $scope.loadFromMenu = function (sec, tut, first) { 
     if (tut === $scope.tutorialNumber && sec === $scope.sectionNumber && !first) {//if clicked on already playing tut 
      return; 
     } 
     if (tut !== undefined && sec !== undefined) { 
      $scope.tutorialNumber = tut; 
      $scope.sectionNumber = sec; 
     } 
     for (var x in sections) { 
      sections[x].active = "inactive"; 
      for (var y in sections[x].tutorials){ 
       sections[x].tutorials[y].active = "inactive"; 
      } 
     } 
     var section = sections[$scope.sectionNumber]; 
     section.active = "active"; 
     section.tutorials[$scope.tutorialNumber].active = "active"; 
     $scope.questionNumber = 0; 
     $scope.currentTutorialName = sections[$scope.sectionNumber].tutorials[$scope.tutorialNumber].name; 
     $scope.$apply(); 
     if ($scope.sectionNumber === 0){ 
      readingController($scope, app.Romanize); 
     }else if ($scope.sectionNumber === 1){ 
      conjugationController($scope); 
     } 
    }; 

    $scope.loadFromMenu(0,0, true); 

    var conjugationController = function(){ 
     var loadNewVerbs = function (scope) { 
      scope.currentVerbSet = scope.sections[scope.sectionNumber].tutorials[scope.tutorialNumber].verbs; 
      if (scope.currentVerbSet === undefined) { 
       alert("Out of new questions"); 
       return 
      } 
      scope.verbs = conjugate(scope.currentVerbSet[scope.questionNumber]); 
      scope.correct = scope.verbs.conjugations[0].text; 
      fisherYates(scope.verbs.conjugations); 
      scope.$apply(); 
     }; 
     loadNewVerbs($scope); 
     $scope.checkAnswer = function (answer) { 
      if($scope.sectionNumber === 0 && $scope.tutorialNumber === 0 && $("video")[0].currentTime < 160){ 
       $scope.message = "Not yet!"; 
       $(".message").show(300).delay(900).hide(300); 
       return; 
      } 
      answer.colorReveal = "reveal-color"; 
      if (answer.text === $scope.correct) { //if correct skip to congratulations   
       $scope.questionNumber++; 
       setTimeout(function() { 
        loadNewVerbs($scope); 
        $scope.$apply(); 
       }, 2000); 
      } else { //if incorrect skip to try again msg 
       if ($scope.sectionNumber === 0 && $scope.tutorialNumber === 0) { 
        start(160.5); 
        pause(163.8) 
       } 
      } 
     }; 
    }; 

}); 

app.factory('Romanize', ['$http', function($http){ 
    return{ 
     get: function(){ 
      $http.get(scope.sections[scope.sectionNumber].romanizeService).success(function(data) { 
       $scope.romanized = data; 
      }); 
     } 
    }; 
}]) 

回答

1

更新:基于下面的意见/讨论:

对于一个服务被实例化,它必须被注入地方–不是随便找个地方–的地方在那里接受角注射。只需将其注入到您的getAnswers控制器中,然后将它传递给您的“控制器”功能:readingController($scope, Romanize)

因为我不认为阅读控制器是一个真正的角控制器,你可以任意命名参数,所以scope应该没问题。在回答


原始的尝试:

进样$scopescope到控制器中:

var readingController = function ($scope, Romanize){ 

然后,我没有得到任何错误:Plunker

+0

当它已经在控制器内部时,这不正是它所称的吗?它在这里被称为if($ scope.sectionNumber === 0){readingController($ scope,app.Romanize);'这就是注入发生的地方不是它吗?无论如何,我也尝试过内部改变它,罗马字仍然是undefined :( – Tules 2013-03-12 18:04:20

+0

是否这是服务在主控制器(getAnswers)之外定义的事实,但readController是从它内部调用的?如果是的话如何使服务在内部可用getControls? – Tules 2013-03-12 18:11:40

+0

@Tules,注入发生在控制器运行之前,当控制器以这种方式定义时,“[推断依赖关系](http://docs.angularjs.org/guide/di)”需要特定的名称 - 也就是'当你定义一个链接函数时,不需要依赖注入,所以你可以随意调用第一个参数,其他的一定是错误的,因为Romanize在我的示例Plunker中被很好的注入了。一个不工作的重击者? – 2013-03-12 18:12:13

相关问题