2013-05-15 73 views
0

我有一個控制器內部的函數,告訴我是否更改了資源,以便只有在沒有更改時纔會發送服務器請求以保存對象。當初始調用clean函數時,它工作正常。但是,如果在由ng-click事件觸發的另一個函數中調用該函數,則會得到不同的結果。爲什麼會這樣呢?Angular.js:爲什麼角度等於給我不同的結果?

示例代碼

app.controller('EditorController', ['$scope', 'Item' function($scope, Item) { 
    $scope.item = Item.get({ id: 1}); 
    $scope.original = angular.clone(item); 
    $scope.isClean = function() { 
     return angular.equals($scope.item, $scope.original); 
    } 

    $scope.isClean(); //returns true 

    $scope.save = function() { 
     if($scope.isClean()) { //is always false here 
     return; 
     } 
     //etc.. 
    } 
}]); 
+0

以任何機會,是你的Item.get一個AJAX請求? –

+1

值得注意的是,angular會在表單上爲你做髒檢查,只需添加[ng-form](http://docs.angularjs.org/api/ng.directive:form)指令。然後你可以使用'$ scope.item。$ dirty'來檢查髒模型。 –

+0

@JonathanPalumbo這不是來自一個表單,但謝謝,這是很好的知道。 – GSto

回答

2

我認爲你有一個同步的問題。這是你的代碼,解釋說:

$scope.item = Item.get({ id: 1}); // Until AJAX completes, $scope.item is undefined 
$scope.original = angular.clone(item); // AJAX hasn't completed yet, this is a clone of undefined 

$scope.isClean(); // Compares undefined to undefined, returns true 

$scope.save = function() { 
    if($scope.isClean()) { // AJAX has loaded, but original is not updated. Now we're comparing an object to undefined. 

    } 
} 

您需要在您的.get指定一個回調來更新原有的,就像這樣:

$scope.item = Item.get({ id: 1 }, function(res) { 
    $scope.original = angular.clone($scope.item) // Could also use 'res' 
}); 
相關問題