如何在http调用后更新视图中的范围变量值?

时间:2015-12-01 09:52:35

标签: javascript angularjs jsp http angularjs-scope

我正在使用 Angularjs 1.4.3 制作我的第一个项目。

在我的控制器中,我正在发出 http 请求,在此http请求的成功方法中,我正在更新范围变量。在http调用中,我获取了最新的值,但在视图方面,它没有更新值。

Plunker Link(@rupesh_padhye谢谢)。 (因为它正在调用servlet操作,因此 Plunker 中不会显示任何数据)

app.controller('measuresCtrl', ['$scope', '$modal', '$http', function($scope, $modal, $http) {



    $scope.groups = []
        $scope.loadAllMeasure = function() {
            $http.get("fetchAllMeasure")
            .success(function(data) {
                console.log("Before insert");
                console.log($scope.groups);

                $scope.groups = data.measures;

                console.log("After insert");
                console.log($scope.groups);
            })
            .error(function() {
            });
        };

        $scope.loadAllMeasure();

$scope.submit = function (form) {
$http({
        method: 'POST',
        url: 'saveMeasure',
        data: {
               id: form.id,
               name: form.name,
               description: form.description
              },
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        }).success(function(data, status, headers, config) {
           $scope.loadAllMeasure();
        }).error(function(data, status, headers, config) {
   });
 }

})

每当我对措施执行任何CRUD操作时,我都会调用方法$scope.loadAllMeasure();。但它没有更新视图(jsp)页面中的值。

我尝试了 $ scope。$ apply 方法,但我收到Error: $digest already in progress

当我在成功方法中使用 console.log 打印 $ scope.groups 的值时,会显示最新值。< / p>

在我的视图(jsp)页面中,我只是使用 ng-repeat 函数以表格格式显示所有记录。

我的观看页面的代码(最小代码) -

<div ng-repeat="group in groups | orderBy:'name'">
    <div>
        <input type="checkbox" id="checkbox-{{group.id}}" class="ui-checkbox" /><label for="checkbox-{{group.id}}">{{group.name}}</label>
    </div>
    <div>{{ group.description}}</div>
    <div>   
            <div class="fa fa-pencil button" data="{{group.id}}" id="{{::elementId}}" ng-click="showEditForm(group.id, $event)"></div>
            <div class="fa fa-trash button" data="{{group.id}}" ng-click="deleteGroup(group.id)"></div>
            <div class="fa fa-clone button" data="{{group.id}}" id="{{::elementId}}" ng-click="showCloneForm(group.id, $event)"></div>
    </div>
</div>

console.log中的值

Before insert
Object { id=1,  description="Measure Description1",  name="Demo"}]

After Insert
 [Object { id=1,  description="Measure Description1",  name="Demo"}, Object { id=2,  description="Description2",  name="Demo2"}]

如何在http调用后更新视图中的范围变量值?

5 个答案:

答案 0 :(得分:3)

将新数据分配给$ scope变量调用后:

$ $范围摘要();

这将更新当前的范围值

此处参考:https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope

答案 1 :(得分:2)

我看不出你的示例代码有什么问题。

我创建了一个JSFiddle试图帮助你。

服务器调用已被一个返回promise的setTimeout函数替换。

请参阅JSFiddle https://jsfiddle.net/sjwkbzxa/

请参阅以下示例:

<div data-ng-controller="TestController as vm">
    <button data-ng-click="loadAllMeasure()">Load List from Server</button>
    <ul>
        <li data-ng-repeat="group in groups | orderBy:'name'">
            <span>{{group.description}}</span>
        </li>
    </ul>
</div>

javascript:

angular.module('application',[]).controller("TestController", ['$scope', '$q', function($scope, $q){    
    $scope.groups = [{ id:1,  description:"Initial List",  name:"Demo"}];

    $scope.loadAllMeasure = function(){
       loadData().then(function(data){
         $scope.groups = data;
       });
     };

    function loadData(){
        var deferred = $q.defer();
        setTimeout(function(){
            var data = [{ id:1,  description:"Measure Description1",  name:"Demo"}, { id:2,  description:"Description2",  name:"Demo2"}];
            deferred.resolve(data);
        }, 3000);
       return deferred.promise;
    }
}]);

也许你错过了我们无法看到的东西?

答案 2 :(得分:1)

我回答这个问题有点晚了,但这是我的2美分:

将服务器数据(response.data)简单分配给$ scope对象似乎对我不起作用

$scope.something = response.data //didn't work

所以,我将一个promise对象从服务返回到控制器,然后使用

angular.copy(response.data,$scope.something) 

复制从服务器返回的值。你也可以将$ scope.something作为函数的参数传递给服务,并且在服务函数中也有angular.copy,但我不知道这样做是否是一个好习惯。

答案 3 :(得分:0)

 $scope.loadAllMeasure = function() {
     CalltoServer();
 };

 CalltoServer = function() {
    return $http.get("fetchAllMeasure")
    .success(function(data) {
        $scope.groups = data.measures;
    })
    .error(function() {
    });
 }

尝试这个,成功将在2或3秒之后,所以我想在事件里面需要rist绑定

答案 4 :(得分:0)

嘿我也遇到了同样的问题,如果还有人在看,那是因为$ http内$ scope变量的变化引起的。我认为在成功函数中创建了一个新的$ scope(一些原型继承的东西)。 所以制作一个变量$ scope的副本,比如

var s = $scope;

然后更改

s.groups = someData;

您的代码:

app.controller('measuresCtrl', ['$scope', '$modal', '$http', function($scope, $modal, $http) {


var s = $scope;
$scope.groups = []
    $scope.loadAllMeasure = function() {
        $http.get("fetchAllMeasure")
        .success(function(data) {
            console.log("Before insert");
            console.log($scope.groups);

            s.groups = data.measures;

            console.log("After insert");
            console.log($scope.groups);
        })
        .error(function() {
        });
    };

    $scope.loadAllMeasure();

$scope.submit = function (form) {
$http({
    method: 'POST',
    url: 'saveMeasure',
    data: {
           id: form.id,
           name: form.name,
           description: form.description
          },
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).success(function(data, status, headers, config) {
       $scope.loadAllMeasure();
    }).error(function(data, status, headers, config) {
});
}
})