Bogopodoben
@Bogopodoben

Как обновить данные после их изменения на сервере, Angularjs?

Суть вопроса, есть некий профиль пользователя, в котором имеется редактирование данных, при сохранение данных они должны сразу же обновляться на странице, без ее перезагрузки.
Почитал интернет, понял, что для этого необходимо использовать $apply.

Сделал в контроллере "personalInfoCtrl" сохранение данных в виде:
$scope.saveUserData = function(form) {
      var data = {
        organization: $scope.edit.organization,
        first_name: $scope.edit.first_name,
        last_name: $scope.edit.last_name,
        middle_name: $scope.edit.middle_name,
        gender: $scope.edit.gender,
        born_date: sliceData($scope.edit.born_date),
        region_id: $scope.edit.region_id,
        timezone: $scope.edit.timezone,
        reg_postcode: $scope.edit.reg_postcode,
        reg_address: $scope.edit.reg_address,
        fact_postcode: $scope.edit.fact_postcode,
        fact_address: $scope.edit.fact_address
      };
      ApiUser.updateInfo(data).then(function(res){
        if (res.data.result == "success") {
          $scope.edit.successChange = true;
          $scope.edit.errorChange = false;
          ApiUser.getInfo().then(function(res) {
            if( !$scope.$$phase ) {
              $scope.$apply(function(){
                $scope.userData = res.data;
              });
            };
            
          });
        } else {
          $scope.edit.errorChange = true;
          $scope.edit.successChange = false;
        }
      });
    };

После отправки данных на серв, я их запрашиваю и пытаюсь обновить scope c данным пользователя.

Так как scope userData лежит в главном контроллере "appCtrl" для всего сайта (родительским), а контроллер "personalInfoCtrl" вложенным для него, возможно по этой причине не могу его обновить. Либо не правильно делаю $apply.
angular.module('app.controller')
.controller('appCtrl', ['$scope', 'authService', 'AuthUser', 'userInfo',
	function ($scope, authService, AuthUser, userInfo) {
		'use strict';

		if (authService.getAuthStatus()) {
			$scope.userData = userInfo.data;
			AuthUser.setRole(userInfo.data.role);
		};

	}]);

Хз в чем именно проблема. Объясните в чем прокол и как привести в норму все?
  • Вопрос задан
  • 572 просмотра
Решения вопроса 1
madmages
@madmages
Человек прямоходящий
не совсем понятно зачем спрашивать с сервера те данные что вы и отправляете. $apply вызывается у $scope если произошли изменения в скопе из вне экосистемы ангуляра, тоесть $timeout(func) это экосистема ангуляра и $apply вызывать не надо, а вот setTimeout(func) это уже то чо называется из вне и внутри нужно вызвать или $digest или $apply что почти одно и тоже.

Далее..
Если вы находитесь в контроллере CTRL_1, который является дочерним к контроллеру CTRL_2 то чтобы внутри контроллера CTRL_1 обратиться к элементам скопа родительского контроллера нужно внутри CTRL_1 вызывать вот так
$scope.$parent.userData = res.data
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы