将$ get promise响应中的参数传递给$ scope

时间:2016-06-21 12:28:40

标签: angularjs

我执行ajax(get)请求并在角度“jobList”服务中获取json数据的承诺。

然后我用获得的数据更新范围。但我的问题是更新范围变量'X'我需要为每个变量“readX”创建一个函数(见下文)。

有没有办法添加参数,比如下面代码中的最后一个函数?

app.controller("JobListController", ['$scope', '$timeout', 'jobList',
    function ($scope, $timeout, jobList) {
        var readList = function (response) {
            if (response) {
                $timeout(function () {
                    $scope.list = response;
                    $scope.$apply();
                });
            }
        };
        var readFamilies = function (response) {
            if (response) {
                $timeout(function () {
                    $scope.allFamilies = response;
                    $scope.$apply();
                });
            }
        };
        var readRegions = function (response) {
            if (response) {
                $timeout(function () {
                    $scope.allRegions = response;
                    $scope.$apply();
                });
            }
        };
        // !!! ----- HERE ------------- !!!
        var readSomething = function (response, something) {
            if (response) {
                $timeout(function () {
                    $scope[something] = response;
                    $scope.$apply();
                });
            }
        };

        jobList.get().then(readList);
        jobList.getAll("allFamilies").then(readFamilies);
        jobList.getAll("allRegions").then(readRegions);
    }]);

3 个答案:

答案 0 :(得分:1)

您可以在获取数据之前将所需属性保存在scope变量中。

这样的事情:

$scope.property = "list";
jobList.get().then(readSomething);

,您的功能现在将成为:

var readSomething = function (response) {
            if (response) {
                $timeout(function () {
                    $scope[$scope.property] = response;
                    $scope.$apply();
                });
            }
        };

P.S:

我猜你也可以使用闭包来做这样的事情:

var readSomething = function (something) {
            return function(response){
                if (response) {
                    $timeout(function () {
                        $scope[something] = response;
                        $scope.$apply();
                    });
                }
           }
        };

答案 1 :(得分:1)

首先,您可以简化这些回调函数:如果回调发生在角度内(并且您将使用$http,那么)您不需要$timeout调用也不是$scope.$apply()电话。此外,您应该将服务编写为仅在返回数据时成功,如果失败则拒绝承诺;以及您不需要if的方式因此每个回调可能只是作业。

如果您正在进行多次返回承诺的呼叫,您可以一起折叠呼叫吗?

$q.all([jobList.get(), jobList.getAll("allFamilies"), jobList.getAll("allRegions")])
.then(([list, families, regions]) => {
    $scope.list = list;
    $scope.allFamilies = families;
    $scope.allRegions = regions;
});

我在这里使用了es6语法:非常值得设置你的构建链以使用类似babeljs的东西,所以你可以使用简写符号进行简单的回调。

如果您真的想单独拨打电话(他们仍然并行评估),您可以编写工厂来生成回调:

function assignToScope(name) {
    return success;

    function success(data) {
        $scope[name] = data;
    }
}
jobList.get().then(assignToScope('list'));
jobList.getAll("allFamilies").then(assignToScope('allFamilies'));
jobList.getAll("allRegions").then(assignToScope('allRegions'));

答案 2 :(得分:0)

试试这个:

    jobList.get().then(function (response) {
    readSomething(response);
    });

函数readSomething只能在输入中有响应。