【问题标题】:Angular.js Call $http.get from outside controllerAngular.js 从外部控制器调用 $http.get
【发布时间】:2018-06-29 02:06:50
【问题描述】:

我有一个 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,而不依赖于为此创建控制器。

谢谢大家。

【问题讨论】:

  • 不太清楚你想做什么一般来说你想使用服务来处理与你的服务器的通信大部分时间。那就是说不清楚你想要发生什么。
  • 我认为您正在进行安静的调用,您可以在其中添加过滤器,根据您页面中的操作,您可以编写一个函数来修改过滤器值,从而将 url 更改为 fetch 。解释完整的场景以获得明确的答案。也许是一个 jsfiddle 或 plunker

标签: javascript angularjs angularjs-scope


【解决方案1】:

一种可能更好的方法

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

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

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

丹尼斯给出的方法有效;但是,如果在 angular 被引导之前调用它,它就不起作用。此外,Derek 似乎对 Dennis 的方法有错误,因为他没有 jquery。

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

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

解释:

角喷射器是一个:

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

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

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

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

注意: 像这样使用注入器时要记住的一件事是,在我自己的发现中,您似乎需要确保在注入中包含您“得到”的模块。例如:

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

【讨论】:

  • 当我说“因为他没有 javascript”时,我喜欢我原来的错字。如果 Derek 没有 JavaScript,我认为我的方法也应该有错误;)我已经更正为“他没有 jquery”
  • 我喜欢你为一个很好的答案道歉:) +1
  • 以这种方式获取模块对我来说似乎真的很慢,并且导致我的应用在下次刷新之前无法加载数据。
  • @sudoman “直到下一次刷新”?也许这是您正在使用的模块的问题。刚刚做了性能测试,半秒左右可以调用1000次:plnkr.co/edit/aXQiHENdb7Pp3VY8BhKe?p=preview
  • 通过控制器获取它似乎更快,我决定将它作为参数从控制器传递给函数。
【解决方案2】:

关于您的问题“...从外部控制器调用 $http.get”,您可以执行以下操作:

... ANYWHERE IN YOUR CODE

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

ANYWHERE IN YOUR CODE ...

查看来自 angular 的官方文档:angular $injector docsget(name); 方法Returns an instance of the service.

【讨论】:

  • 这仅在 Angular 应用程序启动后有效,而不是在此之前
  • 这是正确的方法,但它有效var $http = angular.injector(["ng"]).get("$http");
  • 我的网站没有使用 jQuery,所以我收到了这个错误:“jqLit​​e 不支持通过选择器查找元素!”但是,Exlord 的语法有效。
  • @DerekKurth 显然有点晚了,但请看我的回答
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 2014-09-08
  • 2013-11-28
  • 2016-01-22
  • 2015-01-03
  • 1970-01-01
  • 2012-12-24
  • 2021-12-18
相关资源
最近更新 更多