我有一个Angular指令,允许用户选择输入基因组区域作为一行数据。后端是Rails,我想根据后端验证数据。
在我的指令中,我有这个功能来进行验证
function validateTargets(assemblyid,chrom,chrom_start,chrom_end) {
$http({
method: 'GET',
url: '/api/assemblies/' + assemblyid + '/validate/',
params: {
chrom: 'chr' + chrom,
chrom_start: chrom_start,
chrom_end: chrom_end }
}).success(function(data) {
console.log("valid:" + data['validated']);
return data['validated'];
});
}
独立测试时效果很好,并返回 true 或 false 。用户使用编辑框添加目标,然后调用此代码
scope.addRegion = function() {
scope.onAddTarget({
chrom: (scope.coordinates.chrom || null),
chrom_start: (parseInt(scope.coordinates.start) || null),
chrom_end: (parseInt(scope.coordinates.end) || null),
validated: validateTargets(scope.assemblyid,scope.coordinates.chrom,scope.coordinates.start,scope.coordinates.end)
});
scope.coordinates = {};
}
似乎正在发生的事情是在调用addRegion函数时,validated设置为null或为空。页面上的标记显示所有已填充的字段,但已验证除外,该字段为空或为空(无论正确的js术语是什么)。控制台在验证函数中显示验证的真/假的正确值。
我认为发生的事情是 addRegion 功能在 $ http 调用完成之前完成执行,验证未定义/ null那一点。
我认为需要以某种方式将其包含在承诺中,但我对如何做到这一点感到有些迷失。
答案 0 :(得分:0)
您需要使用回调 - 根据您的代码,您可以执行以下操作:
function validateTargets(assemblyid,chrom,chrom_start,chrom_end, callback) {
$http({
method: 'GET',
url: '/api/assemblies/' + assemblyid + '/validate/',
params: {
chrom: 'chr' + chrom,
chrom_start: chrom_start,
chrom_end: chrom_end }
}).success(function(data) {
console.log("valid:" + data['validated']);
callback(data['validated']);
});
}
scope.addRegion = function() {
validateTargets(scope.assemblyid,scope.coordinates.chrom,scope.coordinates.start,scope.coordinates.end, function(result) {
scope.onAddTarget({
chrom: (scope.coordinates.chrom || null),
chrom_start: (parseInt(scope.coordinates.start) || null),
chrom_end: (parseInt(scope.coordinates.end) || null),
validated: result
});
scope.coordinates = {};
})
}
您需要将回调传递给validateTargets
,以便您可以在其他地方使用http
来电的回复。