簡體   English   中英

angularJS工廠

[英]Factory in 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

誰能幫助我?

發生這種情況是因為Angular $ 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)

哪個有效,因為您明確告訴Angular它必須注入哪些依賴項。

控制器中的依賴項存在問題。 您在數組中具有字符串名稱的名稱與工廠函數的參數不匹配。

這應該工作:

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;
            });
        }
    };
}]);

您應該這樣聲明您的控制器

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

我認為您忘記了$ http.post:

$ http(url,data)應該是$ http.post(url,data)

正如其他人之前所說的,您需要將testFactory注入控制器函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM