Ответ 1
Предполагая, что вы получаете ресурс, а затем помещаете его в текущую область $scope, чтобы он мог быть отредактирован пользователем:
$scope.question = Questions.get({id:"19615328"});
Затем вы можете наблюдать за изменениями следующим образом:
// some flag, name it anything
$scope.userChange = false;
$scope.$watch('question', function(newValue, oldValue) {
if(newValue && newValue != oldValue){
$scope.userChange = true;
// if you want to you can even do this, this will trigger on every change though
$scope.question.$save();
}
}, true);
(Практически все, отсюда, является результатом дополнительных вопросов из чата ниже)
Затем всякий раз, когда вы хотите проверить, было ли изменено, $scope.userChange
может сообщить вам, произошло ли изменение. И когда вы сохраняете объект, reset $scope.userChange
.
Вы даже можете сделать это
$scope.$watch('question', function() {
$scope.question.$save();
}, true);
Очевидно, вы хотите добавить какую-то систему дроссельной заслонки или "debounce", чтобы она ждала секунду или около того, как только вы это сделаете, любое изменение объекта приведет к сохранению через $scope.$watch
.
И в случае, если вы хотите проверить значение null, когда вы еще не получили фактический объект.
$scope.$watch('question', function(newValue, oldValue) {
// dont save if question was removed, or just loaded
if(newValue != null && oldValue != null){
$scope.question.$save();
}
}, true);
Вы можете даже обернуть вызов Questions.get
, см. этот вопрос для ответов на вопрос о том, как вы можете это сделать на сервисе и уровне factory, чтобы что-то сделать как это.
Questions.getAndAutosave = function(options){
var instance = Questions.get(options);
$scope.$watch(function(){
return instance;
},
function(newValue, oldValue){
if (newValue === oldValue) return;
if(newValue != null && oldValue != null){
instance.$save();
}
}, true);
return instance;
};
Тогда всякий раз, когда вы вызываете Questions.getAndAutosave
, все, что возвращается, уже просматривается и будет автоматически $save
'd. Причина, по которой мы делаем if (newValue === oldValue) return;
, состоит в том, что $watch
срабатывает, как только вы ее вызываете, а затем следит за изменениями. Нам не нужно сохранять первый вызов.