在Angular.js工厂中使用$http

5
在我的应用程序中,我使用angular.js和jquery ui自动完成。我遇到了与此处讨论的相同问题。那里接受的答案对我非常有用,正是我需要的,直到今天我需要用$http ajax调用替换静态数组值。我尝试将$http作为参数传递给父函数,但是我得到“未知提供者:autoCompleteProvider<-autoComplete”。我的问题是,如何在不重写或更改当前解决方案的情况下使用$http?
2个回答

12
您需要在您服务的getSource()函数中添加一个回调引用:
app.factory('autoCompleteDataService', ['$http', function($http) {
   return {
       getSource: function(callback) {
          var url = '...';
          $http.get(url).success(function(data) {
             callback(data);
          }
       }
   }
}]);

如果你的服务器返回JSON格式,你也可以使用$http.jsonp。这时别忘了加上JSON_CALLBACK参数。

在你的指令中,你需要添加回调函数本身:

...
autoCompleteDataService.getSource(function(data) {
   elem.autocomplete({
         source: data
         minLength: 2
   });    
});

我已经完成了它,但现在出现了“TypeError: this.source不是一个函数”的错误。 - baba-dev
你能否提供一个示例呢?因为我不知道你如何使用 $http 服务。 - asgoth
抱歉,我打错了一个字,我已经修正了,现在没有错误了,但是也没有数据返回。我使用的是与您上面回答中完全相同的 $http 服务。 - baba-dev
是的,当然。我已经将URL替换为我的Web服务URL,并且可以在Firebug中看到该服务成功返回数据,但是自动完成不起作用,也没有JS错误。 - baba-dev
asgoth - 你的答案是正确的。问题在于我的数据是对象数组:[{city_id:x, city_name:y}],将其更改为[{key:x, value:y}]后,问题得到解决,多么奇怪! - baba-dev

0

这是你可以做到的方法:

app.factory('autoCompleteDataService', ['$http', function($http) {
    return {
        getSource: function() {
            return function(request, response) {
                $http.get(url).success(function(data) {
                    response(data);
                });
            }
        }
    }

}]);

然而,如果您想要先下载整个数据,并允许自动完成小部件在客户端搜索数据,以下是一个示例:

app.directive('autoComplete', function(autoCompleteDataService, $http) {
return {
    restrict : 'A',
    link : function(scope, elem, attr, ctrl) {
        autoCompleteDataService.getData(function(err, data) {
            if (err) {
                console.log("Could not retrieve data.");
                return;
            }

            elem.autocomplete({
                minLength: 0,
                source: data,
                focus: function( event, ui ) {
                    elem.val( ui.item.label );
                    return false;
                },
                select: function( event, ui ) {
                    elem.val( ui.item.label );
                    return false;
                }
            })
            .data( "ui-autocomplete" )._renderItem = function( ul, item ) {
                return $( "<li>" )
                .append( "<a>" + item.label + "</a>" )
                .appendTo( ul );
            };
        });
    }
};

});

app.factory('autoCompleteDataService', ['$http', '$rootScope', function($http, $scope) {
return {
    getData: function(callback) {
        if ($scope.data) {
            return callback(null, $scope.data);
        }

        $http.get('URL')
        .success(function(data) {
            $scope.data = data;
            return callback(null, data);
        })
        .error(function(data) {
            return callback(true, null);
        });
    }
}

}]);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接