【问题标题】:Angular-js $scope variable is not updated in viewAngular-js $scope 变量未在视图中更新
【发布时间】:2019-05-11 00:44:18
【问题描述】:

我是 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>

【问题讨论】:

  • 更正你的html模板{{t.description}}并使用track by $index ng-repeat=" t in tasks track by $index"

标签: angularjs angularjs-http


【解决方案1】:

你必须明白,这些 JS 框架是异步的。现在发生的情况是,如果您执行 API 调用并进行另一个 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 调用之前检查

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 其实我贴错了代码。现在更正了。谢谢。
    • 你能确保你得到正确的响应。如果可能,您可以发布响应 JSON。
    • 为什么是-1,给-1的请告诉我原因!
    • 是的。我得到了正确的回应。发布数据后,数组大小也增加了 1。
    • 你能不能直接打印{{tasks}}到视图中看看它是否来了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多