PHP / AngularJS / Post数据为空

3

我在一个表单中选择了两个字段(月份和来源),并将其提交给一个使用Ionic框架打包的1.3.13版本的AngularJS控制器。

then方法中,通过console.log观察到值已正确填充。

返回的q.promise的值为:[object, object]

HTML模板列表未用正确的预期值填充。

这些值没有填充PHP API中的POST变量。

如何填充POST数据?

在我的模板中,我将其提交给search方法:

 <form method="post" ng-controller="AcpSearchCtrl" ng-submit="search(data)">
    <select name="month" ng-model="data.month">
      <option value="01">January</option>

在我的控制器中,我使用了http.post和一个promise

.controller('AcpSearchCtrl', function($scope, ApiAcpSearch, $ionicLoading, $timeout, $http, ApiAcpEndpoint, $q) {  
  $scope.search = function(data) {
    $ionicLoading.show({
      noBackdrop: false,
      template: '<p>searching ...</p>'
    });
    var q = $q.defer();
    $scope.formData = {};
    $scope.submission = false;
    var param = function(data) {
          var returnString = '';
          for (d in data){
              if (data.hasOwnProperty(d))
                 returnString += d + '=' + data[d] + '&';
          }
          return returnString.slice( 0, returnString.length - 1 );
    };
    console.log('formData : '+$scope.formData);
    return $http({
      url:ApiAcpEndpoint.url,
      data : param($scope.formData),
      method : 'POST',
      headers : {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}
    }) 
    .then(function(data) {      
          q.resolve(data);          
          var acp = {};
          acp.qdata = [ data ];
          $scope.data = acp.qdata;
          $ionicLoading.hide();
          return q.promise;
      });
  }
})
1个回答

5

AngularJS默认使用JSON格式发送数据,您在常规的PHP全局变量($_REQUEST、$_POST或$_GET)中找不到它。

解决这个问题有两种方法:

一种是全局设置AngularJS的默认Content-Type(只在请求前设置头信息不起作用)。

var app = angular.module("app", []);
app.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
    $httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
}]);

另外一种方法是你可以处理AngularJS将数据发送到PHP的方式:

$angularJSData = json_decode(file_get_contents("php://input"));

// json_decode will create an object so if you need in array format
$angularJSData = (array)$angularJSData;

有了这个知识,你可以创建一个函数,甚至是你自己的全局对象。


我只是收到了err_content_encoding错误。 - Ângelo Rigo
1
@ÂngeloRigo 请发布您的整个表单。 - Ricardo Velhote
我将整个表单传递,就像您指示的那样工作!非常感谢。我的问题现在是,在console log中,我看到从Web服务过滤出来的正确数据按月份和来源进行过滤,但模板没有更新以显示此数据,而是显示未经过滤的数据。我在console.log中有$scope.data的真实数据,如何强制更新或返回正确的数据? - Ângelo Rigo
1
@ÂngeloRigo,不了解您的完整需求(或Ionic框架),这是我的建议。我认为在这种情况下使用承诺会使事情变得复杂$http({ /* code */ }).success(function(data) { /* More stuff */ });。您明白我的意思吗? - Ricardo Velhote
是的!我对AngularJS还很陌生,但我会尝试使用http.post而不是Promise,并查看成功部分返回了什么。 - Ângelo Rigo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接