AngularJS JSON没有到达php

时间:2015-04-10 08:44:47

标签: javascript angularjs

我遇到以下问题,我有一个服务,它发出一个http请求,当我尝试获取响应时抛出一个解析器错误,这是因为当它试图解析响应时响应没有准备好。

这是代码

simpafAPIservice.getSimulacao($stateParams.id).success(function(response){
         console.log(JSON.stringify(response[0].info));
         $scope.simuladorInfo.cliente = response[0].cliente;
         $scope.simuladorInfo.info = JSON.parse(response[0].info);
         console.log(JSON.stringify(response[0].info));
         setTimeout(function(){
             for(var i=0;i<$scope.simuladorInfo.info.simuladores.length;i++){
                 $scope.addDataGraphic(i);
             }
         },100);
     });
}

当我在console.log中时,响应会打印一个空字符串,这很奇怪,这就是它抛出此解析器错误的原因。

我的问题是我怎么办。只有在响应准备好后才能使用。

编辑:

最后问题是另一个,我在数据库中存储JSON,但是当JSON有非常信息时它不会到达php。

这是我的PHP代码:

    <?php

$id = $_POST["id"];
$id_col = $_POST["id_col"];
$tipo = $_POST["tipo"];
$cliente = $_POST["cliente"];
$info = $_POST["info"];

date_default_timezone_set("Europe/Lisbon");
$data = date("Y-m-d H:i:s");

require 'connection.php';

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

if($id!=""){
    $sql = "UPDATE `Simulacoes` SET `info`='".$info."' WHERE `id`='".$id."'";
}else{
    $sql = "INSERT INTO `Simulacoes`(`id_col`, `tipo`, `data`, `cliente`, `info`) VALUES ('".$id_col."','".$tipo."','".$data."', '".$cliente."', '".$info."')";
}

if ($conn->query($sql) === TRUE) {
    echo $info;
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

mysqli_close($conn);

?>

这是我得到的回应:

{"data":"","status":200,"config":{"method":"POST","transformRequest":[null],"transformResponse":[null],"params":{"id_col":"1","tipo":"Património Reforma","info":{"simuladores":[{"nome":"ii","info":{"prazoReforma":20,"empreendimentos":{"empreendimentos":[{"id":"1","nome":"Oporto Place","localizacao":"Porto","$$hashKey":"object:50"}],"tipologias":{"0":"Loft","19":"T2","37":"T3"},"plantas":{"0":"3.1","1":"6","2":"8","5":"3.2","12":"2.1","13":"7","14":"2.2","15":"5"},"pisos":[{"id":"2","piso":"1","$$hashKey":"object:69"}]},"entrada":"20000","duracao":"35","taxa":"5","montante":82000,"prestacao":"414","prestacao_seguros":"440","renda_liquida":"320","resultado":-120,"patrimonio":134367},"$$hashKey":"object:38","imovel":{"empreendimento":{"id":"1"},"tipologia":"Loft","planta":"3.1","piso":"2","info":{"condominio":"50","renda":"400  ","preco":"102000  ","id":"1"}},"hide":1}],"montanteTotal":134367,"pensao":"569","idadeActual":"45","idadeReforma":"65","pmII":120,"pmTotal":120}},"url":"php/guarda-simulacoes.php","headers":{"Accept":"application/json, text/plain, */*"}},"statusText":"OK"}

正如你所看到的,当我回显$ info时它什么都不返回,一个空字符串,但在data.config.params中,我得到所有参数。任何人都知道为什么会这样?

2 个答案:

答案 0 :(得分:0)

根据the docs,$ http.success返回第一个参数中的数据,仅当活动的transformResponse可以检测到的是适当的格式时才转换为JSON:

  

Angular提供以下默认转换:

     

...

     

响应转换   ($ httpProvider.defaults.transformResponse和   $ http.defaults.transformResponse):

     

如果检测到XSRF前缀,请将其删除(请参阅安全注意事项   以下部分)。如果检测到JSON响应,则使用a反序列化它   JSON解析器。

如果你的服务器响应空字符串(这里似乎是这种情况) 那么它将不会被检测为JSON对象并且将保持为空字符串。

检查您的服务器响应,它可能是没有正文和错误状态的响应。如果您要求来自不同域的数据(即使它最终是同一台服务器),请注意一件事是same-origin policy

答案 1 :(得分:0)

您的代码看起来没问题,这是承诺并且在成功中执行代码。我认为代替setTimeout你应该使用$timeout,它会在超时完成时运行$digest个周期

<强>代码

simpafAPIservice.getSimulacao($stateParams.id).success(function(response){
         console.log(JSON.stringify(response[0].info));
         $scope.simuladorInfo.cliente = response[0].cliente;
         $scope.simuladorInfo.info = JSON.parse(response[0].info);
         console.log(JSON.stringify(response[0].info));
         $timeout(function(){
             for(var i=0;i<$scope.simuladorInfo.info.simuladores.length;i++){
                 $scope.addDataGraphic(i);
             }
         },100);
     });
}