Как обновить $scope вне модальной начальной загрузки в AngularJS?

#javascript #angularjs #modal-dialog #angularjs-scope

#javascript #angularjs #модальный диалог #angularjs-scope

Вопрос:

У меня есть $scope.users , который отображает некоторые элементы.

Когда я нажимаю на один из этих элементов, появляется модальное сообщение для подтверждения удаления. Запрос на удаление отлично работает, но my $scope.users не обновляется в представлении… Я думаю, это потому $scope.users , что это не тот же контроллер.

Каково решение для обновления области видимости? (без использования $rootscope)?

 app.controller('backController', ['$scope', '$http', '$rootScope','MyFunctions', '$location', '$modal',
  function ($scope, $http, $rootScope, MyFunctions, $location, $modal) {
    MyFunctions.getUsers().then(function (data) {
      $scope.users = data;
    });

    $scope.openModalDeleteUser = function (user) {
      $scope.user = user;
      var modalInstance = $modal.open({
        templateUrl: 'template/app/modalDeleteUser.html',
        controller: 'modalDeleteUserController',
        scope: $scope,
      });
    };

}]);


app.controller('modalDeleteUserController', ['$scope', '$modalInstance', 'MyFunctions',
  function ($scope, $modalInstance, MyFunctions) {

    $scope.delete = function(){
      var data = {};
      data['action'] = 'delete_user';     
      MyFunctions.updateData(data).then(function (response){
        MyFunctions.getUsers().then(function (data) {
          $scope.users = data;
          console.log($scope.users); // Data retrieve is OK, but not updated in the view
        });
      });
      $modalInstance.dismiss('cancel');
    }  

    $scope.cancel = function () {
      $modalInstance.dismiss('cancel');
    };
}]);
  

Ответ №1:

Попробуйте:

 MyFunctions.getUsers().then(function (data) {
      $scope.users.length = 0; //empty the current array
      $scope.users.push.apply($scope.users,data); //push the data array to current array.
});
  

Объяснение:

$scope в вашем modalDeleteUserController является дочерней областью вашей backController области. Когда вы назначаете $scope.users = data; , оно создает новое свойство в вашей дочерней области без обновления родительской области. Текущее решение очищает данные из унаследованного свойства и добавляет к нему новые данные, чтобы родительская область была обновлена.

Из документации:

scope — экземпляр области, который будет использоваться для модального содержимого (на самом деле $modal service собирается создать дочернюю область предоставленной области). По умолчанию используется значение $rootScope

Другим решением является объявление свойства для зависания ваших данных:

 app.controller('backController', ['$scope', '$http', '$rootScope','MyFunctions', '$location', '$modal',
  function ($scope, $http, $rootScope, MyFunctions, $location, $modal) {
    $scope.data = {};//declare a property
    MyFunctions.getUsers().then(function (data) {
      $scope.data.users = data; //store users as a property of this property
    });
  

И тогда вы можете просто использовать $scope.data.users = data; в своем модальном modalDeleteUserController

Примечание: Не забудьте обновить привязки вашего шаблона, чтобы добавить эти .data префиксы.

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

1. лол, БОЖЕ мой! Почему это работает? Отличный ответ, но я не понимаю, почему. Не могли бы вы объяснить, пожалуйста?

2. Большое вам спасибо. Ответ Николаса кажется таким же, но он не работает. Я не понимаю, почему.

3. @Steffi: нет, проблема не имеет ничего общего с $apply . $apply уже вызывается angular, повторный вызов может вызвать исключение. Основная проблема заключается в it creates a new property on your child scope without updating the parent scope

4. Я думаю, что ответ Khanh TOs правильный. Мой неверен. Я удалю свой, так как он не работает.

5. @Steffi: имейте в виду, что apply в моем ответе это не то же самое, что $scope.$apply .