2014-05-16 41 views
0

我正在使用AngularJS創建一個簡單的TODO應用程序,當響應來臨時我將數據發佈到服務器,該響應我想要存儲它現有的變量並刷新視圖。即

// This stores on page load, its working fine 

var todos = $scope.todos = sever_passed_data; 

但是當我做,

$scope.$watch('todos', function() { 
    var request = $http({ 
     method: "post", 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
     url: my_url, 
     data: $.param({todos_list: angular.toJson(todos)}) 
    }); 
    request.success(function(responce){ 
     var todos = $scope.todos = responce; 
    }); 
}, true); 

在此之後它給了我不可思議(它會在無限循環並且發佈數據到服務器)輸出,我指的是responce不專賣店在todos變量。

+0

它看起來好像你看'todos'你的範圍,然後在反應,這導致另一個觀察週期,再次更新它,這會導致另一個觀察週期更新它,在... –

+0

@MarcKline是的,我認爲這是它發生的事情,建議我如何解決這個問題? – Jay

+0

第一個建議是將你的$ http /模型的東西放入服務中。這可以幫助你避免麻煩。然後看看使用$ watch的替代方案。例如,您可以在用戶提交後立即更新視圖,然後手動觸發POST並僅在服務器返回故障時回滾UI更新。 –

回答

0

如果要將HTTP POST的返回值存儲在$scope.todos變量中,應該使用response.dataresponse包含整個HTTP響應,包括響應代碼,響應標題,響應正文等。

爲什麼要聲明本地變量todos?一旦函數退出,它就會超出範圍。只是分配$scope.todos。此外,您可能需要使用then而不是success。這裏有一個例子:

$http({ 
    method: "POST", 
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
    url: my_url, 
    data: $.param({todos_list: angular.toJson(todos)}) 
}).then(function(response) { 
    $scope.todos = response.data; 
}); 
+0

如何做到這一點?? 您可以請簡單解釋一下,我是AngularJS的新手。 – Jay

+0

嘗試上面的代碼,但它仍然給我怪異的輸出:( – Jay