Создание объекта глобальной области видимости

#angularjs

#angularjs ( ангулярджс ) #angularjs

Вопрос:

В следующем коде:

 var myApp = angular.module('myApp', []);

myApp.controller('UserCtrl', ['$scope', function ($scope) {

    // Let's namespace the user details
    // Also great for DOM visual aids too
    $scope.user = {};
    $scope.user.details = {
      "username": "Todd Motto",
      "id": "89101112"
    };

}]);
  

У меня есть объект-член, определенный пользователем ($scope.user). Однако это определяется внутри контроллера. Можно ли создать это как глобальный объект, чтобы другие контроллеры в моем приложении имели доступ к тому же объекту?

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

1. Вы также можете использовать концепцию factory.

Ответ №1:

Вы можете определить службу, которая является общей для всех контроллеров:

 app.factory('userService', function() {
    return {
        user: { 
             details: {
                 username: 'Todd Motto',
                 id: 89101112
             }
        }

    };
});
  

Затем внедрите сервис в свой контроллер:

 app.controller('ctrl', function($scope, userService) {
      $scope.user = userService.user;
});
  

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

1. здесь вы используете factory. ‘$scope’ также может быть введен в параметр функции на заводе. ваш способ тоже правильный. @AndroidDev, это статический способ. чтобы сделать его динамичным, вы должны ввести область видимости…

2. На самом деле $ rootScope может, но не область действия контроллера. Служба ничего не знает о контроллерах.

3. Создает ли $scope.user = UserService.user ссылку на пользователя или копию? Если я обновлю $scope.user в этом контроллере, будет ли он автоматически обновлен во всех других контроллерах, где используется UserService.user?

4. Да, это ссылка — это один и тот же экземпляр.

Ответ №2:

Используйте $rootScope, это сделает его глобальным, поскольку существует только один.

Вот ссылка, чтобы прочитать больше:https://docs.angularjs.org/api/ng/service /$rootScope

Не забудьте внедрить его в свой контроллер перед его использованием.

Надеюсь, это поможет.