2015-12-01 36 views
1

我正在使用我的第一個項目Angularjs 1.4.3如何在http調用後在視圖中更新範圍變量值?

以我控制器我正在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 method,但是我得到Error: $digest already in progress

當我使用的console.log內部成功方法,則打印的值爲$ scope.groups其示出的最新值。

在我的看法(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調用之後應付變量值?

+2

你並不需要更新範圍變量,'$ http'會自動完成 – Satpal

+0

那麼,爲什麼它的顯示舊值鑑於? – Deepu

+0

你可以發佈視圖嗎? – Satpal

回答

2

我看不到什麼毛病你的示例代碼。

我創建了一個JSFiddle來嘗試和幫助你。

服務器調用已被setTimeout函數替換,該函數返回一個promise。

請參閱的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; 
    } 
}]); 

也許你缺少你身邊的東西,我們不能看?

+0

謝謝, 我實際上無法在小提琴中演示它,因爲我的數據來自數據庫通過servlet響應。你提到的靜態數據工作正常,但動態數據不工作。我可以在數據庫console.log中看到更新後的值,但不在視圖中:( – Deepu

+0

@Deepu如果它不適用於來自服務器的數據,則意味着您從服務器獲得的數據格式不正確。使用'setTimeout'或者使用來自API的數據沒有什麼不同 –

+0

數據格式正確,如果我刷新頁面然後我得到所有更新的數據因爲當控制器加載時我調用'$ scope.loadAllMeasure'方法,但即使在保存措施後,我已經調用了相同的方法,但它並沒有更新列表,但是當我刷新頁面時,它會顯示所有數據。 – Deepu

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

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

試試這個,成功將2〜3秒後,所以我需要RIST的事件中猜測綁定

+0

這個也沒有運氣也有:( – Deepu

+0

ng-controller =「measuresCtrl」增加了嗎?或者控制器在路由中聲明瞭嗎?如果不行的話不會工作場景,我沒有發現你的代碼上有任何錯誤 –

+0

我的控制器是** measuresCtrl **和** fetchAllMeasure **是來自servlet的操作方法 – Deepu

0

我有點晚了回答這個問題,但這裏是我的2美分:

服務器的數據(response.data)到$範圍對象的簡單分配沒有似乎對我

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

所以,我回到了一個承諾對象從服務到控制器中,然後用

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

複製從服務器返回的值。你也可以將$ scope.something作爲函數的參數傳遞給服務,並在服務函數中使用angular.copy,但我不知道這是否是一種好的做法。

+0

$ http是異步調用,如果在響應中得到延遲,那麼在angular.copy中將具有與響應值不同的值。無論如何感謝您的回覆。 – Deepu

+0

對不起,不清楚......我在$ http調用返回的promise的'then'子句中使用angular.copy(source,dest)。迄今爲止,我還沒有看到你所報告的問題,但仍會留意。感謝您的高舉。 – AK23

0

嘿,我也面臨同樣的問題,如果有人仍在尋找,它是由$ http變量中的$ 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) { 
}); 
} 
}) 
2

分配新的數據到$範圍變量之後請致電:

$ scope。$ digest();

這將更新當前範圍值這裏

參考:https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope

+0

這比許多上述方法更有效。 –

相關問題