Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有希望的角度过滤器服务_Javascript_Angularjs - Fatal编程技术网

Javascript 有希望的角度过滤器服务

Javascript 有希望的角度过滤器服务,javascript,angularjs,Javascript,Angularjs,我有以下过滤器: app.filter("findDivision", function(divisionService) { var isWaiting = false; var returnValue = null; function myFilter(input) { var translationValue = "Loading..."; if(returnValue) { tr

我有以下过滤器:

    app.filter("findDivision", function(divisionService) {

    var isWaiting = false;
    var returnValue = null;

    function myFilter(input) {

        var translationValue = "Loading...";
        if(returnValue)
        {
            translationValue = returnValue;
        } else {
            if(isWaiting === false) {
                isWaiting = true;
                divisionService.getDivisionById(input).then(function(data) {
                    console.log("GetTranslation done");
                    returnValue = data[0].name;
                    isWaiting = false;
                });
            }
        }

        return translationValue;
    }

    return myFilter;
});
我在
divisionService
中调用的函数如下所示:

 getDivisionById: function (id) {
    var d = $q.defer();
    $http({
        url: api.getUrl2('division'),
        method: "GET",
        params: {filters: {id: {EQUAL: id}}}
    }).success(function (data, status, headers, config) {
        d.resolve(data);
    }).error(function (data, status, headers, config) {
        api.handleError(data);
        console.log(data);
        d.reject(data);
    });
    return d.promise
}
遗憾的是,这一结果的输出如下所示:

 getDivisionById: function (id) {
    var d = $q.defer();
    $http({
        url: api.getUrl2('division'),
        method: "GET",
        params: {filters: {id: {EQUAL: id}}}
    }).success(function (data, status, headers, config) {
        d.resolve(data);
    }).error(function (data, status, headers, config) {
        api.handleError(data);
        console.log(data);
        d.reject(data);
    });
    return d.promise
}


谁能告诉我为什么会这样?如何获得正确的值?

在第一次调用过滤器时,承诺可能还没有解决,因为HTTP调用需要一段时间才能完成。您的筛选代码将立即跳转到return语句
returntranslationvalue。在这种情况下,过滤器返回“加载…”


不幸的是,过滤器在下一个摘要周期之前不会自动重新评估过滤器。Angular无法知道它应该执行另一个摘要周期,因为没有任何更改(没有用户交互或更改$scope)。作为实验,尝试通过更改模型手动触发摘要循环,例如使用
输入
框和
ng模型
。此时,您将看到筛选器将重新计算并显示输出。

筛选器应该是同步的,您不能在其中使用异步服务。不过,您可以让它工作,在这种情况下,您需要有状态筛选器:在您的情况下,只需在返回
myFilter之前添加一行。$stateful=true。我是否可以创建一个指令,然后使用服务并更新文本