当前位置: 首页 > 面试题库 >

AngularJS:如何在过滤器中使用$ http

邵奇
2023-03-14
问题内容

我想在过滤器中向后端请求并返回请求的结果。问题是服务$ http返回一个承诺,这就是问题。

对于存在的问题,我用$超时和角度在我的小提琴的承诺: 我的小提琴

在我的过滤器中,我使用带有承诺的$ timeout,但是最终目标是使用请求http:

myApp.filter('filterHello', function ($http,$timeout,$q) {
return function (company_id) {
    console.log("in the filter");
    var deferred = $q.defer();   
    $timeout(function() {
        deferred.resolve("ca marche");
    }, 2000);                  
    return deferred.promise;
};

});

然后在我看来,我使用了我的过滤器,该过滤器假定以2秒的延迟显示“ ca marche”,但这不起作用:

<div ng-controller="MyCtrl">
   {{hello|filterHello}}
</div>

您会看到过滤器不返回任何内容,并且由于我认为为null,因此过滤器中存在无限循环。

如果您不明白为什么要在过滤器中使用请求http,那么答案很简单。例如,我有一个对象用户,其字段为:email,name,company_id.。我还有另一个对象公司,其字段为:name,createOn,…。我想使用这样的过滤器来显示该对象的名称。用户的公司:

{{user.company_id | ShowNameCompany}}

因此,我需要在过滤器中向后端的公司控制器发送请求http。

我希望有一个人可以帮助我。


问题答案:

我认为您不应该那样使用过滤器。过滤器用于根据可选参数转换输入。

这里的问题是您将立即从filter函数返回一个promise。过滤器结果使Angular无法处理任何事情。

因此,我的建议是-先获取结果,然后根据结果使用过滤器:

var app = angular.module("my.module");

app.controller("MyCtrl", ['$http', '$scope', function(http, scope) {
  scope.hello = "foo";
  http.get('http://my.service.com').then(function(data) {
    scope.filterParams = data;
  }, function(err) {
    scope.filterParams = undefined;
  });
}]);

app.filter("filterHello", function() {
  return function(input, params) {
    if(typeof params === "undefined") {
      return "";
    }
    //work with the params here
  };
});

并在模板中:

<div ng-controller="MyCtrl">
  {{hello|filterHello:filterParams}}
</div>

编辑:只需阅读您的解释。对我来说,这将是指令的候选人:

app.directive("companyName", ['$http', function(http) {
  return {
    template: "<span>{{name}}</span>",
    scope: {
      companyId: "="
    },
    link: function(scope) {
      http.get("http://my.service.com/companies/" + scope.id).then(function(result) {
        scope.name = result.name;
      }, function(err) {
        scope.name = "unknown";
      });
    }
  }
}]);

并在模板中:

<span company-name company-id="user.company_id"></span>

如果您有很多公司,则应该预先加载名称(也许会首先发送给他们第一个响应?),因为您会在服务器上大量询问。



 类似资料:
  • 问题内容: 当我用ng-repeat迭代一些数组时,我想在过滤器中使用参数 例: HTML部分: JavaScript部分: 但是我希望能够使用像 但是它不起作用。我该怎么做? 问题答案: 更新: 我想我对文档的了解并不足够,但是您绝对可以使用具有以下语法的过滤器过滤器(请参阅此小提琴)来按对象的属性过滤: 如果有帮助,这是我的原始答案: 使用过滤器过滤器将无法传递参数,但是至少可以做两件事。 1

  • 过滤器可用在任何api或者ng.$rootScoe.Scope的执行过程中,不过一般用来格式化绑定在模板中的表达式。 \{\{ expression | filter \}\} 过滤器一般在处理过程中将数据转变成新的格式。它能使用链式风格,还能接受附加参数。 你可以像下面这样使用链式风格: \{\{ expression | filter1 | filter2 \}\} 你也可以使用“:”来传

  • 问题内容: 我的过滤器很少 在我的项目中,要获得良好的结果,我必须在控制器中进行此过滤,而不是在视图中 我知道基本的语法,但我不知道如何在控制器中制作过滤器链,因此一切都将如模板中的示例一样工作。 我找到了一些解决方案,现在仅使用一个过滤器,但是应该可以用于许多;) 我在ng-repeat中使用此功能可以正常工作,但是我必须使用少量过滤器进行检查。 问题答案: 您只需重新过滤您从第一个过滤器返回的

  • 问题内容: 我有一个包含JSON对象的数组(_users)。 1-如何仅过滤具有“活动”:“ 1”而不是“ 0”的用户 我已经尝试过这样的事情: 但无法为我正常工作。 谢谢! 问题答案: 由于您的对象模型有点复杂,因此我建议您使用自定义过滤功能: 然后在您的HTML中: 这是工作中的jsFiddle:http : //jsfiddle.net/pkozlowski_opensource/4kzzy

  • 问题内容: 我正在尝试做类似的事情: AngularJs部分: 但是不知何故,它向我展示了所有物品。如何筛选(键,值)? 问题答案: Angular 过滤器只能通过angular的API应用于数组,而不能应用于对象- “从数组中选择项的子集,并将其作为新数组返回。” 您在此处有两个选择: 1)移至数组或 -2)预过滤项目,如下所示: 并在控制器上: jsfiddle :http : //jsfid

  • 本文向大家介绍Angularjs中如何使用filterFilter函数过滤,包括了Angularjs中如何使用filterFilter函数过滤的使用技巧和注意事项,需要的朋友参考一下 AngularJS的filter,中文名“过滤器”是用来过滤变量的值,或者格式化输出,得到自己所期望的结果或格式的东东。AngularJS中有一个filterFilter函数用来对集合过滤,非常方便。 源代码大致如下