javascript - AngularJS : Asynchronously initialize filter

标签 javascript angularjs asynchronous filter

我在尝试使用异步数据初始化过滤器时遇到问题。

过滤器非常简单,它需要将路径转换为名称,但要做到这一点,它需要一个对应数组,我需要从服务器获取该数组。

我可以在返回函数之前在过滤器定义中执行一些操作,但异步方面阻止了这种情况

angular.module('angularApp').
  filter('pathToName', function(Service){
    // Do some things here

    return function(input){
      return input+'!'
    }
  }

使用 promise 可能是可行的,但我对 Angular 负载如何过滤没有任何清晰的了解。 这个post解释了如何通过服务实现如此神奇的效果,但是是否可以对过滤器执行相同的操作?

如果有人对如何翻译这些路径有更好的想法,我洗耳恭听。

编辑:

我尝试使用 promise 方法,但有些东西不对劲,而且我看不出是什么:

angular.module('angularApp').filter('pathToName', function($q, Service){

  var deferred = $q.defer();
  var promise = deferred.promise;

  Service.getCorresp().then(function(success){
    deferred.resolve(success.data);
  }, function(error){
    deferred.reject();
  });

  return function(input){
    return promise.then(
      function(corresp){
        if(corresp.hasOwnProperty(input))
          return corresp[input];
        else
          return input;
      }
    )
  };
});

我不太熟悉 Promise,这是使用它们的正确方法吗?

最佳答案

这是一个例子:

app.filter("testf", function($timeout) {
    var data = null, // DATA RECEIVED ASYNCHRONOUSLY AND CACHED HERE
        serviceInvoked = false;

    function realFilter(value) { // REAL FILTER LOGIC
        return ...;
    }

    return function(value) { // FILTER WRAPPER TO COPE WITH ASYNCHRONICITY
        if( data === null ) {
            if( !serviceInvoked ) {
                serviceInvoked = true;
                // CALL THE SERVICE THAT FETCHES THE DATA HERE
                callService.then(function(result) {
                    data = result;
                });
            }
            return "-"; // PLACEHOLDER WHILE LOADING, COULD BE EMPTY
        }
        else return realFilter(value);
    }
});

这个fiddle是使用超时而不是服务的演示。

<小时/>

编辑:根据 sgimeno 的评论,必须格外小心,不要多次调用该服务。请参阅上面代码和 fiddle 中的 serviceInvoked 更改。另请参阅 Angular 1.2.1 的 fork fiddle 和用于更改值并触发摘要周期的按钮:forked fiddle

<小时/>

编辑 2:根据 Miha Eržen 的评论,此解决方案对 Angular 1.3 没有记录器工作。不过,使用 $stateful 过滤器标志,解决方案几乎是微不足道的,记录在 here在“状态过滤器”下,以及必要的 forked fiddle .

请注意此解决方案会损害性能,因为每个摘要循环都会调用过滤器。性能下降可能可以忽略不计,也可以忽略不计,具体取决于具体情况。

关于javascript - AngularJS : Asynchronously initialize filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19046641/

相关文章:

javascript - 将对象转换为数组进行存储并返回数组以在 JavaScript 中应用

javascript - 等待 javascript 异步回调@http post

javascript - 将参数传递给函数 Reactjs

javascript - 使用 Jquery 用除 div 之外的任何标签包装文本?

javascript - 为什么我收到 ReferenceError : Response is not defined?

javascript - 评估自定义指令内的表达式

javascript - AngularJS : How to watch a service object

c++ - 从 C++ 运行 CURL 以异步获取多个 URL

angularjs - 使用 Angular $ q.all处理错误

javascript - JavaScript变量缓存在哪里?有没有办法更有效地手动缓存?