2013-05-23 2 views
2

Я использую угловой $resource вместе с angular.copy, чтобы позволить пользователю сбросить форму. Когда пользователь нажимает кнопку сохранения, я вызываю $scope.save(), а $resource сохраняется с помощью $save(). Внутри обратного вызова $save я заменяю мастер и модель, чтобы отразить изменения, сделанные на бэкэнд, в то время как $watch не может получить изменения, пока пользователь не вручную отредактирует форму.

Любые идеи, почему?

// db.schema is a $resource 
var master = db.schema.get(function() { 
    $scope.schema = angular.copy(master); 
}); 

$scope.$watch('schema', function() { 
    // triggers when $scope.schema is changed 
}, true); 

$scope.save = function() { 
    $scope.schema.$save(function(savedSchema) { 
     master = new db.schema(savedSchema); 

     // this won't trigger the $watch, but editing the form will 
     $scope.schema = angular.copy(master); 
    }); 
}; 

ответ

2

Это потому, что наблюдатель сравнивает для объекта равенства вместо ссылочного (третий параметр в $scope.$watch метод true). Внутренний Угловой angular.equals(newValue,oldValue) вместо newValue === oldValue. Если вы делаете var b = angular.copy(a), тогда angular.equals(a,b) является истинным (но a === b является ложным).

Кроме того, когда вы $scope.schema.$save значение $scope.schema заменяется на ответ от сервера - Я пытался объяснить, что происходит:

$scope.save = function() { 
    $scope.schema.$save(function(savedSchema) { 
    // $scope.schema === savedSchema is now true 
    // if you don't want this behavior you could do db.schema.save({},$scope.schema ... instead 

    // if the request body equals the response body the watcher will not get called, 

    master = new db.schema(savedSchema); 
    // master is now a copy of savedSchema 
    // angular.equal(savedSchema, master) is true 
    // savedSchema === master is false 

    // this won't trigger the $watch, but editing the form will 
    $scope.schema = angular.copy(master); 
    // $scope.schema is now a copy of a copy of itself... 
    // $scope.schema === savedSchema is now false 
    // angular.equal(savedSchema,$scope.schema) is true 
    }); 
}; 
+0

Весьма полезно, но я до сих пор не получил его на работу , Ваш первый комментарий «// $ scope.schema === savedSchema теперь true» на самом деле не соответствует действительности, если ответ ajax отличается. Я снова открою вопрос, так как я не совсем понял, что я делаю неправильно. – Mickel

+0

Хм, я уверен, что это верно независимо от вашего ответа - пока 'isArray' не соответствует действительности. Вы можете проверить [исходный код] (https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js), это не так много строк. Предполагая, что 'obj' является экземпляром $ resource' Res', 'obj. $ Save (success)' аналогичен выполнению 'Res.save.call (obj, success)'. См. Строку # 449: 'var value = this instanceof Resource? this: ... ', затем строка # 484:' (success || noop) (значение, response.headers); '(первый параметр в функции обратного вызова успеха -' значение', а значение - это экземпляр, который вызывает $ save). – joakimbl

Смежные вопросы