Angular-js $ scope变量在视图中未更新

时间:2018-12-10 05:55:27

标签: angularjs angularjs-http

我是angular-js的新手,正在构建一个简单的待办应用程序。我正在创建一个任务,并使用ng-repeat在html表中显示创建的任务。但是问题在于发布数据之后,$ scope.tasks变量在控制器端而不是视图中更新。该视图仅在刷新网页后更新,并且该任务已添加到html表中。创建任务后如何更新视图。提前致谢。这是我的代码:

在我的控制器中:

var app = angular.module('MyApp', ['ngMaterial', 'ngMessages']);
app.controller('DemoCtrl', function($scope,$mdSidenav,$mdDialog,$interval,$http,$mdToast) {
     $scope.tasks = []; 
   _refreshTaskData();  //initial refresh

  $scope.submitForm = function() {

        var description = "";
        var taskId = "";

        $scope.formData = {
                taskId: $scope.taskId,
                description: $scope.description,
         };

        $http({
            method: "POST",
            url: 'savetask',
            data:  angular.toJson($scope.formData),
            headers : {
                'Content-Type': 'application/json',
            }
        }).then(_success, _error);
      };

    function  _refreshTaskData() {
        $http({
                method : 'GET',
                url : 'getTask',

            }).then(function(res) { // success
                $scope.tasks = res.data;
            }, function(res) { // error
                console.log("Error: " + res.status + " : " + res.data);
            });
    }

    function _success(res) {
         $mdDialog.hide();
         console.log('in success function');
        _refreshTaskData(); ;
    }

    function _error(res) {
           //error handling
     }
}); 

我认为:

<table>
   <tr ng-repeat=" t in tasks">
      <td>{{t.id}}</td>
      <td>{{t.description}}</td>
   </tr>
</table>

2 个答案:

答案 0 :(得分:0)

您必须了解这些JS框架是异步的。现在发生的事情是,如果您执行一个API调用并进行另一个基于其第一个结果的API调用,则控制台不会等待一个API的结果,而是直接向前移动。因此,您的情况有时/很多次发生,在为POST调用提供服务之前,控制器无法及时使用GET获取新数据,因此无法更新视图。您可能要做的就是仅在提供POST时强制GET

$http({
        method: "POST",
        url: 'savetask',
        data:  angular.toJson($scope.formData),
        headers : {
            'Content-Type': 'application/json',
        }
    }).then(function(res){
         $http({
            method : 'GET',
            url : 'getTask',

        }).then(function(res) { // success
            $scope.tasks = res.data;
        }, function(err) { // error
            console.log("Error: " + err.status + " : " + err.data);
        });
    });

最好是从后端发送成功消息并在GET调用之前进行检查

答案 1 :(得分:-2)

我认为您在任何时候都不会调用_refreshEmployeeData。如果在JS中添加它而不是_refreshTaskData,那么您将能够在视图中查看结果。

也请使用ng-init调用控制器中的_refreshEmployeeData。那将是初始化字段的最佳方法。