2013-01-12 33 views
3

用例:用戶創建一個新任務,必須通過API向上遊發送。當該API返回成功時,我將其添加到顯示範圍。我有這樣的工作很好:Angular:推送,然後刪除一個項目

$http.post('some_url', newtask).success(function(data) { 
    $scope.tasks.push(data); 
}); 

(newtask是一個簡單的對象,前面定義,這裏沒有顯示)。

問題是,API很慢(雖然可靠),但我希望這感覺像一個實時應用程序。因此,我想立即將新任務推送到$ scope,然後在API返回成功時將其替換爲「真實」任務。所以,我在前面加上上面:

$scope.tasks.push(newtask); // Add to UI immediately (provisionally) 

現在發生的是,新的任務將立即添加,則任務的副本添加時,API返回。所以我想要做的是刪除第一個副本一旦添加第二個副本。

我似乎無法找到一種方法來做到這一點。或者我的方法都錯了? (我承認,這種方法確實感覺像是一種黑客,所以我願意接受建議)。

回答

2

在成功回調函數中,我建議您將新任務(從API返回)與任務數組中的最後一個任務進行比較。如果他們匹配,你不必做任何事情。 (如果它們不匹配,你將需要刪除的最後一個項目,並拋出了某種錯誤指示。)

$http.post('some_url', newtask).success(function(data) { 
    if($scope.tasks[$scope.tasks.length-1] === data) { 
     // do nothing, we already added it before 
    } else { 
    ... error handling here 
    } 
}); 

如果用戶不能同時添加多個任務(前API返回),你真的要刪除,然後添加,需要使用數組正常的JavaScript操作,以刪除最後一個項目,然後添加API值:

$http.post('some_url', newtask).success(function(data) { 
    $scope.tasks.pop(); 
    $scope.tasks.push(data); 
}); 

角應注意模型的變化,並自動更新爲你的觀點。

+0

馬克,賓果!非常感謝,這提供了我所需要的洞察力。很好地工作。 – shacker

0
//Push the new task immediately 
$scope.tasks.push(newtask); 

//When API return check for error if error just pop out the added task 
$http.post('some_url', newtask).success(function(data) { 
    if($scope.tasks[$scope.tasks.length-1] !== data) { 
     $scope.tasks.pop(); 
    } 
}); 
相關問題