如何让此过滤器从$ http或$ resource返回值

时间:2015-06-24 19:10:44

标签: javascript angularjs

在我的html中,我有{{i.userId |用户名 }} 。基本上我试图将其转换为名称。我正在使用过滤器来执行此操作,但我在使用异步函数时遇到了很多问题以获取数据。

                app.filter('userName', function($http) {
                     return function(value) {
                         if (!value) return '';

                         var user;
                         $http({
                             method: 'GET',
                             url: 'http://localhost:3000/api/Users?filter=                                                                                                      
                             {"where":{"id":' + value + '}}'
                         }).success(function(response) {
                             user = response;
                         });

                         return user.name;

                     }
                 });

我试图将其置于回调格式中,但我无法让它发挥作用。

1 个答案:

答案 0 :(得分:0)

在过滤器中使用异步调用将不起作用,因为Angular假定您的过滤器是无副作用的,并且仅在模型更改时执行它们。在异步调用返回之前,过滤器已完成其工作,并且将来不会被调用,直到模型更新。

您的选择是通过在过滤器函数上定义$stateful属性来使过滤器具有状态:

function filterFunction(value) {
    if (!value) return '';

    var user;
    $http({
        method: 'GET',
        url: 'http://localhost:3000/api/Users?filter=                                                                                                      
                                 {"where":{"id":' + value + '}}'
    }).success(function (response) {
        user = response;
    });

    return user.name;

}
filterFunction.$stateful = true;
return filterFunction;

如上所述使过滤器具有状态,Angular将在每个摘要周期对此进行评估。所以这根本不具备表现力。

请参阅过滤器上的developer guide

更好的方法是一次性获取用户列表,然后通过实现自定义过滤器来搜索此列表,该过滤器也将此列表作为输入。

相关问题