Angular.js从外部控制器调用$ http.get

时间:2014-06-05 03:49:33

标签: javascript angularjs angularjs-scope

我有一个HTTP资源,它返回数据库中前10个实体的JSON列表。 我这样称呼它:

var filter= "john";
var myApp = angular.module('myApp', []);
myApp.controller('SearchController', ['$scope','$http', function ($scope, $http) {
    $http.get('/api/Entity/Find/' + filter). //Get entities filtered
        success(function (data, status, headers, config) {
            $scope.entities = data;
        }).
        error(function () {
        });
    }]);

有效!

但是......如何更改filter变量才能更改查询? 我应该重写整个控制器以使其工作吗?

更新

很抱歉我的问题不明确。当我问这个时,我无法承担任何AngularJS。

我最初的意图是注入变量$http,而不依赖于为此创建控制器。

谢谢大家。

2 个答案:

答案 0 :(得分:20)

一种可能更好的方法

如果您不想将其放入控制器中,您可以将其注入配方(例如,提供商,工厂,服务): https://docs.angularjs.org/guide/providers

myApp.factory('getStuff', ['filter', '$http', function (filter, $http) {
    //Blah
}]);

如果你想在任何角度结构之外获得$ http的实例,你可以执行以下所示的操作。

丹尼斯给出的方法有效;但是,如果在自动引导角度之前调用它,则它不起作用。此外,似乎德里克与丹尼斯的错误有关。方法,因为他没有jquery。

Exlord提到的解决方案更好,因为它没有那个问题,而且更合适:

$http = angular.injector(["ng"]).get("$http");

<强>解释

角度注射器是:

  

可用于检索服务和依赖注入的对象

https://docs.angularjs.org/api/ng/function/angular.injector

函数angular.injector将模块作为参数并返回注入器的实例。

因此,在这种情况下,您将检索ng模块的注入器(angular&#39; s),然后检索服务$ http。

注意: 使用像这样的注射器时要记住的一件事是,在我自己的研究结果中,你似乎需要确保在注射中包含模块,你是什么&#34;得到&#34;需要。例如:

angular.injector(['ng', 'ngCordova']).get('$cordovaFileTransfer')

答案 1 :(得分:8)

关于你的问题&#34; ...从外部控制器调用$ http.get&#34;你可以做到以下几点:

... ANYWHERE IN YOUR CODE

var $http = angular.element('html').injector().get('$http');
$http.get(...).success(...);

ANYWHERE IN YOUR CODE ...

请参阅棱角分明的官方文档:angular $injector docsget(name);方法Returns an instance of the service.