在 AngularJS 中如果要使用 AJAX 就必須透過 $http 這個物件來處理

基本用法

<!DOCTYPE HTML>
<html ng-app="BallApp">
    <head>
        <meta charset="utf-8">
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js"></script>
        <script src="module.js"></script>
    </head>
    <body>
        <h2>View Render</h2>
        <!-- 點擊後送出 request -->
        <form ng-controller="AjaxCtrl">
            <button ng-click="ajax()">AJAX</button>
        </form>
    </body>
</html>

module.js

var ballApp = angular.module('BallApp', []);

ballApp.controller('AjaxCtrl', function($scope, $http) {
    $scope.ajax = function() {
        // 基本用法
        $http({
            method: 'GET',
            url: 'test.php',
            params: {
                name: 'Johnson'
            }
        })
        .success(function(data, status, headers, config) {
            console.log(data);
            console.log(status);
        })
        .error(function(data, status, headers, config) {
            // Error
        });
    };
});

$http.post
$http 也提供了快速使用 HTTP Verbs,例如直接使用 POST
注意:由於 AngularJS 的 POST 預設用的 Content-Type 是 application/json;charset=utf-8,而且也不會對資料做serialize的處理,如果直接使用後端會抓不到 POST 的資料

$http.post的使用方法很簡單

$http.post('test.php', param).success(function(data) {});

在沒有任何修改狀況下,PHP 必須要用 input 取得資料

$value = json_decode(file_get_contents('php://input'));
print_r($value);

當然也可以利用 jQuery 的 $.post ,缺點就是還要另外載入 jQuery

var ballApp = angular.module('BallApp', [], function($httpProvider) {
    // 利用 $httpProvider 修改 header
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
});

ballApp.controller('AjaxCtrl', function($scope, $http) {
    $scope.ajax = function() {
        // 利用 jQuery 的 $.param 將參數物件轉換成 query string
        var data = $.param({name: 'Febr'});
        $http.post('test.php', data)
        .success(function(data) {
            console.log(data);
        });
    };
});

又或者按照網路上 這裡 提供的方法,自己處理Serialize

var ballApp = angular.module('BallApp', [], function($httpProvider) {
    // 修改 header
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

    // Serialize function
    var param = function(obj) {
        var query = '', name, value, fullSubName, subName, subValue, innerObj,i;
        for(name in obj) {
            value = obj[name];

            if(value instanceof Array) {
                for(i = 0; i < value.length; ++i) {
                    subValue = value[i];
                    fullSubName = name + '[' + i + ']';
                    innerObj = {};
                    innerObj[fullSubName] = subValue;
                    query += param(innerObj) + '&';
                }
            } else if(value instanceof Object) {
                for(subName in value) {
                    subValue = value[subName];
                    fullSubName = name + '[' + subName + ']';
                    innerObj = {};
                    innerObj[fullSubName] = subValue;
                    query += param(innerObj) + '&';
                }
            } else if(value !== undefined && value !== null) {
                query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
            }
        }

        return query.length ? query.substr(0, query.length - 1) : query;
    }

    // 覆寫 $http 參數處理的方法(利用param function 處理參數)
    $httpProvider.defaults.transformRequest = [function(data) {
        return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
    }];
});

ballApp.controller('AjaxCtrl', function($scope, $http) {
    $scope.ajax = function() {
        $http.post('test.php', {name: 'Febr'})
        .success(function(data) {
            console.log(data);
        });
    };
});

其他用法可直接參考官網文件

Categories: AngularJS