2013-08-17 50 views
13

我有一段時間試圖找出爲什麼我在Angular中收到未知提供者錯誤。我已經檢查了我能找到的關於這個主題的其他所有問題,並且大多數提示依賴注入中存在錯誤。但是,在我看來,我忘了注入任何東西。我一直試圖讓解析屬性像this post by Misko一樣工作。我能夠在解決了員工數據後控制檯註銷,但隨後出現「未知提供者」錯誤,這會導致數據無法顯示在頁面上。錯誤:未知提供者:employeesProvider < - employees

這裏是我的路由器:

"use strict"; 

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

    app.config(appRouter); 

    function appRouter ($routeProvider) { 
     $routeProvider 
     .when('/employees/:account_id', { 
      controller: 'EmployeeCtrl', 
      templateUrl: 'view/employee/view.html', 
      resolve: employeeCtrl.resolve 
     }) 

     .otherwise({ redirectTo: '/' }); 
    } 

這裏是我的控制器

var employeeCtrl = app.controller('EmployeeCtrl', [ 
     '$scope', 
     'employees', 
     function ($scope, employees) { 
     $scope.employee = employees; 
     console.log($scope.employee); 
     } 
    ]); 

    employeeCtrl.resolve = { 
     employees: function (Employee, $q, $route) { 
     var deferred = $q.defer(); 
     console.log("current params: ", $route.current.params.account_id); 
     Employee.getOne({ id: $route.current.params.account_id }, function (successData) { 
      deferred.resolve(successData); 
     }, function (errorData) { 
      deferred.reject(errorData); 
     }); 
     return deferred.promise; 
     } 
    }; 

而我廠:

angular.module('employeeServices', ['ngResource']) 
     .factory('Employee', ['$resource', function ($resource) { 
     return $resource('/employees/:id/json', 
      { 
      id: '@account_id' 
      }, 
      { 
      'save': { 
       method: 'POST', 
       isArray: false 
      }, 
      'update': { 
       method: 'PUT', 
       params: { 
       id: '@account_id' 
       } 
      }, 
      'remove': { 
       method: 'DELETE', 
       params: { 
       id: '@account_id' 
       } 
      }, 
      'getOne': { 
       method: 'GET', 
       params: { 
       id: '@account_id' 
       }, 
       isArray: false 
      }, 
      'query': { 
       method: 'GET', 
       params: { 
       id: '@account_id' 
       }, 
       isArray: true 
      } 
      } 
     ); 
     }]); 

任何建議將非常感謝!

+0

是什麼在你的控制器解決功能?對我來說沒有意義。 –

回答

46

所以,問題是,我是建立通過NG-控制器EmployeeCtrl控制器我部分的觀點裏,像這樣:

<div class="viewPage" ng-controller="EmployeeCtrl"> 

當使用解析但是,控制器的設置必須通過路由器完成,以便在運行時可用。我刪除了ng-controller="EmployeeCtrl ...

<div class="viewPage"> 

...和presto,就像什麼都沒發生過。

我必須指出,我從收到的實物幫助,患者的鄉親在the AngularJS IRC channel ...

+1

因爲我設置控制器與ngController指令,並在路線我得到未知的提供商的錯誤消息。我forgott從HTML代碼中刪除ngController。謝謝,syou救了我的日子 – tschiela

+0

你絕對是天才和救星! 2016年的 – unruledboy

+0

,這仍然很棒。我花了一個多小時。哦,不!非常感謝! – Rexford

0

由於您定義了名爲Employee的工廠,因此在將其注入控制器時應使用名稱來指代此模塊。

var employeeCtrl = app.controller('EmployeeCtrl', [ 
     '$scope', 
     'employees', 

更改爲

var employeeCtrl = app.controller('EmployeeCtrl', [ 
     '$scope', 
     'Employee', 
+0

我認爲這個問題起初也是這樣,但似乎'Employee'工廠正被注入到控制器中'resolve'對象中定義的'employees'函數中。這有任何意義嗎? –

+0

@MichaelBenford原始代碼中的第二'employees'是局部變量,只要它與模塊按順序匹配,就可以將其重命名爲任何東西。局部變量無關緊要,你可以執行'app.controller('EmployeeCtrl',['$ scope','Employee',function(s,e)'和'e'將被注入'Employee'模塊。但是模塊名稱'Employee'是工廠定義的任何東西,並且必須完全按照定義使用。 – zsong

+0

我不是在談論'employees'的參數,我真的在談論這個:'employeeCtrl .resolve = {employees:function(Employee,$ q,$ route)...'。什麼是'resolve'?爲什麼它直接在控制器中直接定義?我以前從未見過這樣的代碼。 –

相關問題