从发送http post请求的submit()更改$ scope变量

时间:2016-07-29 07:03:57

标签: angularjs http post submit

我无法在$scope请求的成功回复中设置$http.post的值。帖子请求是使用submit()从表单提交通过ng-submit="submit()"函数发送的。

chatApp.controller('createController', ['$scope', '$http', '$location', function($scope, $http, $location) {
    $scope.fullname;
    $scope.create = function() {
        // console.log($scope.email, $scope.password, $scope.firstname, $scope.lastname);
        $http.post('ajax/createaccount.php', {
            'email': $scope.email,
            'username': $scope.username,
            'password': $scope.password, 
            'firstname': $scope.firstname, 
            'lastname': $scope.lastname
        }).then(function(data) {
            console.log("Success");
            $scope.fullname = data.config.data.firstname + " " + data.config.data.lastname;
            console.log($scope.fullname);
            $location.path("/createsuccess");
        }, function() {
            console.log("Error");
        })
    }
    console.log($scope.fullname);
}]);

第一个console.log($scope.fullname)输出正确的数据。

第二个console.log($scope.fullname)输出'未定义'。

我感谢每个花时间看这个的人。

2 个答案:

答案 0 :(得分:0)

then的{​​{1}}上尝试更新以下内容:

$http.post

to(除非数据对象是显式data.config.data.firstname / WS不返回数据):

$scope.fullname = data.config.data.firstname + " " + data.config.data.lastname;

如果这不能解决问题,请尝试$scope.fullname = data.firstname + " " + data.lastname; 查看来自服务器的console.log(data);方法响应。

答案 1 :(得分:0)

这是非常基本的。 A JAX请求是异步执行的异步请求。因此,当您使用$http方法(使用AJAX将数据发布到服务器)提交表单时,将在服务器响应后执行成功回调。

因此,您不能期望在提交表单后执行上一个console语句。

chatApp.controller('createController', ['$scope', '$http', '$location', function($scope, $http, $location) {

    console.log("1");
    $scope.fullname;

    $scope.create = function() {
        console.log("2");
        $http.post('ajax/createaccount.php', {
            'email': $scope.email // your data
        }).then(function(data) {
            console.log("3");
        }, function() {
            console.log("Error");
        })

        console.log("4");
    }

    console.log("5");
}]);

当您createController进行实例化时,您会首先看到输出1,然后是5。当您使用create()方法提交表单时,您会看到输出2 - > 4几秒后3

修改

要实际修复您评论的问题,可以使用$rootScope,但不建议使用$rootScope。因此,我建议您创建一个全局控制器并将其分配给body标记,如

<body ng-controller="GlobalController">

在那里定义一个对象:

chatApp.controller("GlobalController", ["$scope", function($scope) {

    $scope.globalData = {};
}]);

这将在整个应用程序中创建一个通用的Angular范围,以便您可以保持共同和通用数据。并且每个子控制器(在这种情况下都是createController)将从此全局控制器继承数据。

现在,修改你的createController代码,如下所示:

chatApp.controller('createController', ['$scope', '$http', '$location', function ($scope, $http, $location) {

    $scope.create = function () {
        // console.log($scope.email, $scope.password, $scope.firstname, $scope.lastname);
        $http.post('ajax/createaccount.php', {
            'email': $scope.email,
            'username': $scope.username,
            'password': $scope.password,
            'firstname': $scope.firstname,
            'lastname': $scope.lastname
        }).then(function (data) {
            console.log("Success");
            $scope.globalData.fullname = data.config.data.firstname + " " + data.config.data.lastname;
            console.log($scope.fullname);
            $location.path("/createsuccess");
        }, function () {
            console.log("Error");
        })
    };

    console.log($scope.globalData.fullname);
}]);

或者,您可以创建一个Angular服务/工厂来保存公共数据。