Противоречивые данные AngularJS после сохранения

#javascript #angularjs

#javascript #angularjs

Вопрос:

У меня есть форма профиля пользователя, где пользователь может изменить там имя и загрузить изображение профиля. После сохранения своих данных пользователи возвращаются на домашнюю страницу, где на боковой панели отображается информация об их профиле.

Проблема иногда заключается в том, что запрос GET на заполнение пользовательского ресурса выполняется до того, как серверная часть завершит обработку запроса POST, который обновил пользовательский ресурс. Есть ли какое-либо хорошее решение этой проблемы?

Соответствующий код контроллера:

 $scope.user.$save();
$location.path('/');
  

Комментарии:

1. Может быть, вам следует перенаправлять только при успешном выполнении или в качестве обратного вызова после сохранения? В Angular вы можете определить действие в методе обратного вызова, вы должны поместить перенаправление туда вместо того, чтобы просто переходить построчно.

2. можем ли мы получить часть кода? если ПОЛУЧЕНИЕ происходит вследствие post, вы могли бы связать это в обратном вызове, или, возможно, серверная часть могла бы вернуть разницу в записи после завершения POST, и вы могли бы обновить ее.

3. Я попробовал решение обратного вызова, и оно работает, но загрузка больших изображений занимает несколько секунд, в результате чего пользователь застревает в форме профиля пользователя в ожидании. Есть ли способ обновить профиль на боковой панели после завершения публикации?

4. Звучит как новый вопрос.

Ответ №1:

Из Angular docs:

Методы действия для объекта класса или экземпляра объекта могут быть вызваны со следующими параметрами:

HTTP ПОЛУЧАЕТ действия «класса»: Resource.action([параметры], [успех], [ошибка])

действия, не ПОЗВОЛЯЮЩИЕ ПОЛУЧИТЬ «класс»: Resource.action([параметры], postData, [успех], [ошибка])

действия, не СВЯЗАННЫЕ с получением экземпляра: instance.$action([параметры], [успех], [ошибка])

Обратный вызов выполняется успешно с аргументами (value, responseHeaders). Обратный вызов с ошибкой вызывается с аргументом (HttpResponse).

Итак, вам нужно было бы сделать:

 $scope.user.$save({}, function(data,headers) {
    //success
    $location.path('/');
}, function(response) {
    //error       
    alert("error")         
});
  

Или

 $scope.user.$save({}, {}, function(data,headers) {
    //success
    $location.path('/');
}, function(response) {
    //error       
    alert("error")         
});
  

Я не уверен, что классифицируется как «коллективное действие» — я предполагаю, что user является экземпляром, но я не уверен.

Если вы хотите обновить информацию на боковой панели, вы могли бы сообщить, что публикация завершена:

 $rootScope.$broadcast('user:saved')
  

и выполняйте любую логику, которая вам нужна, на боковой панели

 //in your sidebar controller or wherever
$scope.$on('user:saved', function() {

});