【问题标题】:angularjs will not bind data to $scope after $http call and promise return在 $http 调用和承诺返回后,angularjs 不会将数据绑定到 $scope
【发布时间】:2017-11-16 22:42:47
【问题描述】:

将数据绑定到名为$scopethings 的变量时遇到问题。我调用mysql数据库,它通过express发送数据。

app.get('/options', function(req, res)
{
var arr = [];
var query = "SELECT * FROM memberships";
con.query(query, function(err, result)
{
    if (err)
    {
        console.log("error retriving memberships from the db " + err);
        throw err;
    }
    res.send(result);
}); 


 /* server side of things  */

现在去角边。

    app.controller('MainController', ['$http', '$scope', '$log', 
    'getmemOptions', function($http, $log, $scope, getmemOptions)

    {
    var gymmem = this;
    gymmem.onSubmit = onSubmit;

    gymmem.options;
    $scope.things;
    var promise = $http.get('/options');

    promise.then(function(payload)
    {
     $scope.things = angular.copy(payload.data);
     alert(JSON.stringify($scope.things)); // 1st call view $scope.things
});

    alert(JSON.stringify($scope.things)); // 2nd call view $scope.things

在我第一次致电JSON.stringify($scope.things) 时,我可以看到它从数据库中提取了正确的信息;但是第二次调用产生未定义。我知道 $http 调用将如何返回承诺的 javascript 的异步性质。我相信我正确地处理了承诺,但如果我不是,请告诉我如何改变事情。提前谢谢你!

编辑

这里是 angular-formly 模板。

     gymmem.model = 
    {
        first_n: '',
        last_n: '',
        email: '',
        age: '',
        memberships: '',
    };

    gymmem.fields = [
        {
            key: 'first_n',
            type: 'input',
            model: gymmem.model.f_name,
            templateOptions: 
            {
                type: 'text',
                label: 'First Name',
                placeholder: 'Enter your first name',
                required: true
            }
        },

       {
            key: 'last_n',
            type: 'input',
           // model: gymmem.model.l_name,
            templateOptions: 
            {
                type: 'text',
                label: 'Last Name',
                placeholder: 'Enter your last name',
                required: true
            }
        },

        {
            key: 'email',
            type: 'input',
            //model: gymmem.model.email,
            templateOptions: 
            {
                type: 'text',
                label: 'Email Address',
                placeholder: 'Enter your email address',
                required: true
            },
            hideExpression: '!model.first_n || !model.last_n' 
        }, 

         {
            key: 'age',
            type: 'input',
            //model: gymmem.model.age,
            templateOptions: 
            {
                type: 'number',
                label: 'Age (must be 16+)',
                placeholder: 'Enter your age',
                required: true
            },
            //check if customer is 16+
            validators:
            {
                    ofAge: function($viewValue, $modelValue, scope)
                    {
                        var age = $viewValue || $modelValue;
                        if (age >= 16)
                            return true;
                        return false;
                    }
            }
        },

         {
            key: 'memberships',
            type: 'select',
            model: gymmem.model.membership,
            templateOptions: 
            {
                label: 'Membership Types',
                required: true,
                placeholder: "Select Membership",
                options: $scope.things//[{"name":"Martial Arts Membership","value":45},{"name":"Regular Gym Membership","value":30},{"name":"Cardio Classes Membership","value":35}]


            }
        },

    ]; 

    function onSubmit()
    {
            //alert(JSON.stringify(gymmem.model), null, 2);
            $http.post('/', gymmem.model).success(function(req)
            {
                gymmem.model = {};
                console.log("Front end data " +req);
            }).error(function(err)
            {
                console.log(err);
            });
    };


   }

]);

这里是html以防万一。

<body ng-app="GymApp" ng-controller="MainController as gymmem">

<div class="container col-md-4 col-md-offset-4">
    <form ng-submit="gymmem.onSubmit()" novalidate>
        <h1> Buy Gym Membership(s) </h1>
        <formly-form model="gymmem.model" fields="gymmem.fields">
        <button type="submit" class="btn btn-primary submit-button">Submit</button>
        </formly-form>
    </form>
</div>  
</body>

[{"name":"武术会员","value":45},{"name":"普通健身房会员","value":30},{"name":"有氧运动会会员" ,"value":35}] 是我希望 $scope.things 拥有的数据。这里的数据是通过 $http.get() 调用处理的。

对于格式问题,我们深表歉意。刚接触 stackoverflow 发帖,有点赶时间。

【问题讨论】:

    标签: mysql angularjs node.js angular-formly


    【解决方案1】:

    在我看来,如果您在第一个 alert() 中获得结果,那么您正在处理 $http 调用。

    这里的问题似乎在您的控制器声明中:

    app.controller('MainController', ['$http', '$scope', '$log', 
    'getmemOptions', function($http, $log, $scope, getmemOptions)
    

    您的依赖注入不匹配。请注意$scope 是您的第二次注入,但在您的控制器功能中您将其称为$log。所以你实际上并没有在这里绑定任何东西到$scope。你真的想把它绑定到$log

    将控制器声明中依赖项的顺序更改为:

    app.controller('MainController', ['$http', '$scope', '$log', 
    'getmemOptions', function($http, $scope, $log, getmemOptions)
    

    【讨论】:

    • 我改变了依赖的顺序;但这不是问题所在。在我将它绑定到名为“var options”的变量之前,但我添加了 $scope 以查看是否可以改变任何东西。我是 angularjs 的新手,所以如果有什么简单的,请告诉我。另外,为什么投反对票?
    • @SimronPatel,绑定到名为 options 的变量仅在您使用 ControllerAs 语法时才有效,您似乎正在尝试使用 gymmem。如果您正在获取数据,那么您没有将其正确绑定到模板。你也可以提供你的模板代码吗?反对票的不是我。我会支持你,这绝对是一个有效的问题。
    • 当然,给我一点时间。感谢您的支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2015-01-30
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多