我执行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);
}]);
答案 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只能在输入中有响应。