如何处理过滤器内的承诺?

时间:2015-10-19 15:08:03

标签: angularjs

我想创建一个过滤器,将货币转换为另一种货币,例如日元到美元,我希望它简单如下:

{{ myMoneyInYen | usd }}

我的问题是,我从API获取用于转换的值,但我似乎无法使其工作。它只是空白。如果我能做到的话,那将是非常好的。你们认为我应该把它变成一个指令呢?

module.filter('svcData', ['promisedSvc', function(promisedSvc) {
  return function(input) {

    promisedSvc.then(function(svc) {
      var valuesUsedForConversion = svc.getData(input);
      //DO actual conversion here.
      return convertedValue;
    });


  };
}]);

2 个答案:

答案 0 :(得分:0)

在解析您的承诺时,您应该将结果数据设置为范围可访问变量,然后过滤此变量。

答案 1 :(得分:0)

您可以使用有状态过滤器:

    angular.module("app").filter('svcData', function($http) {
        var cached = {};
        var apiUrl = 'http://my.service.com';
        function svcDataFilter(data_id, data_prop) {
            if (data_id) {
                if (data_id in cached) {
                    // avoid returning a promise!
                    return typeof cached[data_id].then !== 'function' ?
                        cached[data_id][data_prop] : undefined;
                } else {
                    cached[data_id] = $http({
                        method: 'GET',
                        url: apiUrl + data_id
                    }).success(function (data) {
                            cached[data_id] = data;
                        });
                }
            }
        }
        svcDataFilterFilter.$stateful = true;
        return svcDataFilterFilter;
})

并像这样使用它:{{data_id |svcData:'property'}}

注意:将在每个摘要周期上调用函数svcDataFilter。

此外,如果缓存增长过大,您需要找到一种方法来重置缓存。

请参阅:https://glebbahmutov.com/blog/async-angular-filter/

并且上面的链接(上面的链接不会显示它,所以这里是直接链接):http://plnkr.co/edit/EK2TYI1NZevojOFDpaOG?p=preview