Я изучаю Angularjs, и я создал простую форму. На самом деле я разработчик PHP, поэтому я предпочел использовать php в качестве языка сценариев на стороне сервера. Я не могу отправить данные на сервер, я пробовал так много методов, но это очень сложно, если я пытаюсь использовать стандартный метод. Angularjs не работает, пожалуйста, проверьте мой код и дайте мне лучший метод работы с angularjs, jquery и php. Помоги мне!
angular.module("mainModule", []) .controller("mainController", function($scope, $http) { $scope.person = {}; $scope.serverResponse = ''; $scope.submitData = function() { var config = { headers: { "Content-Type": "application/x-www-form-urlencoded" } }; $http.post("server.php", $scope.person, config) .success(function(data, status, headers, config) { $scope.serverResponse = data; }) .error(function(data, status, headers, config) { $scope.serverResponse = "SUBMIT ERROR"; }); }; });
<?php if (isset($_POST["person"])) { // AJAX form submission $person = json_decode($_GET["person"]); $result = json_encode(array( "receivedName" => $person->name, "receivedEmail" => $person->email)); } else { $result = "INVALID REQUEST DATA"; } echo $result; ?>
<!DOCTYPE html> <html> <head> </head> <body ng-app="mainModule"> <div ng-controller="mainController"> <form name="personForm1" novalidate ng-submit="submitData()"> <label for="name">First name:</label> <input id="name" type="text" name="name" ng-model="person.name" required /> <br /> {{person.name}} <br /> <label for="email">email:</label> <input id="email" type="text" name="email" ng-model="person.email" data-parsley-type="email" required /> <br /> <br /> <button type="submit">Submit</button> </form> <br /> <div> {{$scope.serverResponse}} </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <!--<script type="text/javascript" src="script/parsley.js"></script> <script src="script.js"></script>--> </body> </html>
Обновлено , это код, который был протестирован только с php и Apache – и он работает. Я также изменил файл server.php, как показано ниже. Файл был создан на основе примера серверных вызовов AngularJS Hub. Тот же источник использовался для создания вызова метода mainController.js $ http.post (…), чтобы он успешно отправлял данные на сервер.
Скриншот (после отправки)
server.php
<?php if ($_SERVER["REQUEST_METHOD"] === "POST") { $result = "POST request received!"; if (isset($_GET["name"])) { $result .= "\nname = " . $_GET["name"]; } if (isset($_GET["email"])) { $result .= "\nemail = " . $_GET["email"]; } if (isset($HTTP_RAW_POST_DATA)) { $result .= "\nPOST DATA: " . $HTTP_RAW_POST_DATA; } echo $result; } ?>
personForm.html
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> </head> <body ng-app="mainModule"> <div ng-controller="mainController"> <form name="personForm1" validate ng-submit="submit()"> <label for="name">First name:</label> <input id="name" type="text" name="name" ng-model="person.name" required /> <br /> {{person.name}} <br /> <label for="email">email:</label> <input id="email" type="text" name="email" ng-model="person.email" required /> <br /> <br /> <button type="submit">Submit</button> </form> <br /> <div> {{serverResponse}} </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.11/angular.min.js"></script> <script src="mainController.js"></script> <!--<script type="text/javascript" src="script/parsley.js"></script> <script src="script.js"></script>--> </body> </html>
mainController.js
angular.module("mainModule", []) .controller("mainController", function ($scope, $http) { $scope.person = {}; $scope.serverResponse = ""; $scope.submit = function () { console.log("form submit"); var params = { name: $scope.person.name, email: $scope.person.email }; var config = { params: params }; $http.post("server.php", $scope.person, config) .success(function (data, status, headers, config) { console.log("data " + data + ", status "+ status + ", headers "+ headers + ", config " + config); $scope.serverResponse = data; console.log($scope.serverResponse); }) .error(function (data, status, headers, config) { console.log("error"); $scope.serverResponse = "SUBMIT ERROR"; }); }; });// JavaScript source code
Альтернативный способ: с обработкой JSON:
server_json.php
<?php if ($_SERVER["REQUEST_METHOD"] === "POST") { /* code source: http://stackoverflow.com/a/22852178/2048391 */ $data = array(); $json = file_get_contents('php://input'); // read JSON from raw POST data if (!empty($json)) { $data = json_decode($json, true); // decode } print_r($data); } ?>
Скриншот (после отправки)
Кажется, из вашего кода вы неправильно поняли некоторые концепции.
DOCTYPE
должны находиться внутри корневого тега html
. Рекомендуется добавить JS в нижней части тега body
который (концептуально) будет способствовать производительности загрузки страницы. submitData
в область своего контроллера, но вы его никогда не называете. Возможно, ваше намерение было использовать его, когда пользователь отправляет форму, поэтому вам нужно удалить атрибуты action
и method
из формы и добавить ng-submit
: <form name="personForm1" method="post" novalidate ng-submit="submitData(person, 'thePropNameOnWhichYouWantToSaveTheReturnedData')">
. Оба аргумента являются избыточными, так как вы используете их в области $scope
. config
переданный с помощью службы $http
используется для конфигураций, а не для данных. Читайте здесь: Угловые $ http $http
отправляет JSON в качестве тела запроса. Кажется, что вы ожидаете формы на вашем PHP-коде. Например, это можно изменить в config
, или вы можете узнать, как десериализовать JSON на PHP (извините, я не знаю PHP). $scope
чтобы можно было визуализировать. Исправлено предложение кода клиента:
angular.module("mainModule", []) .controller("mainController", function($scope, $http) { $scope.person = {}; $scope.serverResponse = ''; $scope.submitData = function() { // Let's say that your server doesn't expect JSONs but expects an old fashion submit - you can use the `config` to alter the request var config = { headers: { "Content-Type": "application/x-www-form-urlencoded" } }; $http.post("server.php", $scope.person, config) // You can remove the `config` if the server expect a JSON object .success(function(data, status, headers, config) { $scope.serverResponse = data; }) .error(function(data, status, headers, config) { $scope.serverResponse = "SUBMIT ERROR"; }); }; });
<!DOCTYPE html> <html> <head> </head> <body ng-app="mainModule"> <div ng-controller="mainController"> <form name="personForm1" novalidate ng-submit="submitData()"> <label for="name">First name:</label> <input id="name" type="text" name="name" ng-model="person.name" required /> <br /> {{person.name}} <br /> <label for="email">email:</label> <input id="email" type="text" name="email" ng-model="person.email" data-parsley-type="email" required /> <br /> <br /> <button type="submit">Submit</button> </form> <br /> <div> {{$scope.serverResponse}} </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <!--<script type="text/javascript" src="script/parsley.js"></script> <script src="script.js"></script>--> </body> </html>
Вы используете угловую форму и отправляете данные из контроллера внутри, тогда не стоит упоминать action="server.php" method="post"
потому что вы собираетесь выполнять этот вызов с контроллера, то есть $http.post('server.php')
.
Просто добавьте ng-submit="submitData(person, 'result')"
директива в свой тег формы, которая вызовет ваш метод контроллера, который отправляет данные, и ваш код начнет работать.
HTML
<form name="personForm1" novalidate ng-submit="submitData(person, 'result')"> <label for="name">First name:</label> <input id="name" type="text" name="name" ng-model="person.name" required /> <br />{{person.name'}} <label for="email">Last name:</label> <input id="email" type="text" name="email" ng-model="person.email" data-parsley-type="email" required /> <br /> <br /> <button type="submit">Submit</button> </form>
Надеюсь, это может вам помочь. Благодарю.