2014-07-16 124 views
0

我試圖在angularJS中使用工廠,但我沒有按預期工作。工廠在angularJS

這裏是我的控制器:

as.controller('Test', ['testFactory', function($scope, $http, $rootScope) 
{ 

    $http.get($rootScope.appUrl + '/nao/test/test') 
     .success(function(data, status, headers, config) { 
      $scope.test = data; 
    }); 

    $scope.form = {}; 

    $scope.submitForm = function(isValid) { 
     if(isValid) 
     { 
      testFactory.testFactoryMethod(function($http) { 
       $scope.test = data; 
      }); 
     } 
    }; 
}]); 

正如你所看到的,我「包括」我的工廠到控制器。

這裏是我廠:

.factory('testFactory', function($http) { 
    return { 
      testFactoryMethod: function(callback) { 
       return $http('http://127.0.0.1:81/test/test', data).success(function(data) { callback(data); 
      }); 
     } 
    }; 
}); 

當我運行它,我得到這個錯誤信息:

Error: $http is undefined 
@http://127.0.0.1:82/nao/js/controllers.js:82:3 

任何人誰可以幫我嗎?

回答

0

我想你忘記了$ http.post:

$ HTTP(URL,數據)應該是$ http.post(網址,數據)

其他人之前說過,你需要注入testFactory在控制器功能。

4

這是因爲角度$injector。當您提供一個數組作爲.controller的第二個參數時,$injector會嘗試查找其名稱上列出的所有依賴項,然後將它們注入到數組的最後一個元素(它必須是function),所以就您的情況而言,會發生什麼情況:

'testFactory' -> $scope 
undefined -> $http 
undefined -> $rootScope 

你的代碼應該是這樣的:

as.controller('Test', ['$scope', '$http', '$rootScope', 'testFactory', function($scope, $http, $rootScope, testFactory) 
{ 
    // ... 

...或者是這樣的:

as.controller('Test', function($scope, $http, $rootScope, testFactory) 
{ 
    // ... 

編輯:作爲@ sp00m指出,第二個例子不應該,如果你要醜化(縮小)你的代碼中使用,因爲uglifier算法將喜歡的東西取代這些標識符:

function(a, b, c, d) 

然後AngularJS將無法找到這些依賴了,而第一個例子是這樣的:

['$scope', '$http', '$rootScope', 'testFactory', function(a, b, c, d) 

這是有效的,因爲你明確告訴角哪些依賴一定要注。

+0

謝謝你的回答。 – user500468

+0

更好地使用第一種語法,如果你忽略了你的代碼,你可能會遇到第二種語法的問題。 – sp00m

+0

我很樂意提供幫助。另請考慮閱讀['$ injector'文檔](https://docs.angularjs。組織/ API /自動/服務/ $噴油器)。 –

3

控制器中的依賴關係存在問題。您在數組中使用的名稱與您的工廠函數的參數不匹配。

這應該工作:

as.controller('Test', ['$scope', '$http', '$rootScope', 'testFactory', function($scope, $http, $rootScope, testFactory) 
{ 
    $http.get($rootScope.appUrl + '/nao/test/test') 
     .success(function(data, status, headers, config) { 
      $scope.test = data; 
     }); 

    $scope.form = {}; 

    $scope.submitForm = function(isValid) { 
     if(isValid) 
     { 
      testFactory.testFactoryMethod(function($http) { 
       $scope.test = data; 
      }); 
     } 
    }; 
}]); 
0

你應該申報控制器這樣

as.controller('Test', ['$scope', '$http', '$rootScope', 'testFactory', function($scope, $http, $rootScope, testFactory) 
{ 
    .... 
}