2014-01-23 40 views
5

嗨我正在嘗試使用Angular的路由來解決控制器作用域的必要對象。我已閱讀了一些關於如何執行此操作的教程,但仍然收到Unknown Provider錯誤。這個問題似乎與project被注入ProjectDetailCtrl角度路由器解決了一個未知提供者錯誤的結果

app.js

var myApp = angular.module('myApp', ['ngRoute']); 

myApp.config(function ($interpolateProvider, $routeProvider) { 
    $routeProvider 
    ... 
    .when('/project/:projectId', { 
     templateUrl : 'partials/_project_detail.html', 
     controller: 'ProjectDetailCtrl', 
     resolve: { 
      project: function ($route, MyService) { 
       return MyService.get('projects/', $route.current.params.projectId).then(function(data) { 
        console.log('VERIFY DATA: ', data); 
        return data; 
       }); 
      } 
     } 

controllers.js

.controller('ProjectDetailCtrl', function ($scope, project) { 
    $scope.project = project; 
} 

EDIT

services.js

.factory('MyService', function ($http, $q) { 

var MyService = { 
    ... 
    get: function (items_url, objId) { 
     var defer = $q.defer(); 
     $http({method: 'GET', 
      url: api_url + items_url + objId}). 
      success(function (data, status, headers, config) { 
       defer.resolve(data); 
      }).error(function (data, status, headers, config) { 
       defer.reject(status); 
      }); 
     return defer.promise; 
    }, 

EDIT2

的問題是顯然不與服務的方法,因爲這也產生錯誤:

app.js

var myApp = angular.module('myApp', ['ngRoute']); 

myApp.config(function ($interpolateProvider, $routeProvider) { 
    $routeProvider 
    ... 
    .when('/project/:projectId', { 
     templateUrl : 'partials/_project_detail.html', 
     controller: 'ProjectDetailCtrl', 
     resolve: { 
      project: {title: 'foo'} 
     } 
    }); 

})

我可以驗證我的決心f聯合被正確地返回,但Angular仍然抱怨說project是未知。這裏有什麼問題?我已經嘗試將我的控制器製作成模塊並將其傳遞給myApp模塊,但我仍然對project獲得相同的Unidentified Provider問題。

任何幫助非常讚賞。

注意:我正在使用Angular 1.2.9。

EDIT3:解決方案

所以這個問題是此行中我的模板:

<!-- WRONG: <div ng-controller="ProjectDetailCtrl">--> 
<div> 

    <h2 ng-show="project">Project: <strong>{{ project.title }}</strong></h2> 

</div> 

顯然,ng-controller指令不能與決心使用。

+0

什麼是確切的錯誤? '''未知的提供者projectProvider'''? –

+0

'組件$注入器中未知提供程序錯誤 –

+0

[AngularJS,解決方案和未知提供者]的可能重複(http://stackoverflow.com/questions/14846466/angularjs-resolve-and-unknown-provider) – DDM

回答

2

你忘了添加ngRoute爲你的模塊的依賴。這就是爲什麼$ routeProvider和$ route服務未定義。

更新

this例子。問題出在ng-controller指令

+0

對不起 - 我剛剛拿出這些依賴關係來使問題更加精確。在我的代碼中,'ngRoute'存在 - 問題仍然存在。 –

+0

@達爾文科技看到這[問題](https://github.com/angular/angular.js/issues/2619)。你不用'''ng-controller'''指令嗎? –

+0

@DarwinTech用小提琴更新答案。 –

0

您正在返回MyService.get,這是一個承諾,然後在承諾的結果中,您將返回數據....但是是什麼?

您想要退回承諾,但不是最初的承諾......所以您使用$q來創建您自己的承諾,並且Angular會在加載您的路線之前等待並解決它。

project: function ($route, MyService) { 
      var deferred = $q.defer(); 
      MyService.get('projects/', $route.current.params.projectId).then(function(data) { 
       console.log('VERIFY DATA: ', data); 
       deferred.resolve(data); 
      }); 
      return deferred.promise; 
     } 

或者,假設MyService。得到的回報承諾,你應該能夠只是做

project: function ($route, MyService) { 
      return MyService.get('projects/', $route.current.params.projectId); 
     } 

很顯然注入$q到配置

+0

hmmm。我已經從我的服務中返回了延期承諾,但我應該在之前包含該代碼。請參閱我的編輯。 –

+0

是的,但是你通過做'then'來處理它,它基本上說我們完成了這個承諾。看到我的第二個編輯。承諾需要返回角度而不是數據。 –

+0

我明白你的意思了,這也可能需要解決。但是,這不是問題。如果我切換出一個簡單對象的Service方法,則錯誤仍然存​​在。 –

0

此問題已被asked before,因此它是一個可能的重複。

  • 最重要的答案指出標記中控制器的使用是否導致了這種情況。
  • 搜索您的代碼庫(準確地說是markuptemplates)的術語ng-controller
  • 驗證是否有匹配的控制器,因爲在這種情況下ProjectDetailCtrl
  • 從標記

它解決了我的情況下,問題將其刪除。

相關問題