Angular:通过$ http验证数据

时间:2014-10-08 20:03:11

标签: angularjs

我有一个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那一点。

我认为需要以某种方式将其包含在承诺中,但我对如何做到这一点感到有些迷失。

1 个答案:

答案 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来电的回复。