Подтвердить что ты не робот

Определенные глобально контроллеры и инкапсуляция AngularJS

Согласно учебнику AngularJS, функция контроллера просто находится в глобальной области.

http://docs.angularjs.org/tutorial/step_04

Выполняют ли функции контроллера самостоятельно автоматически анализируются в инкапсулированную область или они живут в глобальной области? Я знаю, что им передается ссылка на их собственную область $scope, но оказывается, что сама функция просто сидит в глобальной области. Очевидно, что это может вызвать проблемы в будущем, и я научился через опыт и образование, чтобы инкапсулировать. Более того, если они будут жить в рамках глобального масштаба, не следует ли считать лучшей практикой инкапсулировать их в объект, на который нужно ссылаться

    Object.functionName();

Вместо этого:

    functionName();

Итак, чтобы предотвратить проблемы, связанные с загрязнением глобальной сферы действия (т.е. переопределяющие функции и т.д.)

4b9b3361

Ответ 1

AngularJS поддерживает 2 метода регистрации функций контроллера - либо как глобально доступные функции (вы можете увидеть эту форму в упомянутом учебнике), либо как часть модулей (которые образуют свое пространство имен). Более подробную информацию о модулях можно найти здесь: http://docs.angularjs.org/guide/module, но вкратце зарегистрировать контроллер в модуле следующим образом:

angular.module('[module name]', []).controller('PhoneListCtrl', function($scope) {

  $scope.phones = [..];

  $scope.orderProp = 'age';
});

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

Вкратце: AngularJS позволяет правильно инкапсулировать функции контроллера, но также предоставляет более простой, быстрый и грязный способ объявить их глобальными функциями.

Ответ 2

Вы можете зарегистрировать контроллер как часть модуля, как ответили pkozlowski-opensource.

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

angular.module('[module name]', []).
  controller('PhoneListCtrl', ['$scope', function($scope) {

    $scope.phones = [..];
    $scope.orderProp = 'age';
  }]);

Это будет работать так же после "minification":

angular.module('[module name]', []).
  controller('PhoneListCtrl', ['$scope', function(s) {

    s.phones = [..];
    s.orderProp = 'age';
  }]);

Это обозначение можно найти в разделе "Inline Annotation" в Injection Dependency.

Чтобы протестировать контроллер, который был зарегистрирован как часть модуля, вы должны попросить angular создать ваш контроллер. Например:

describe('PhoneListCtrl test', function() {
  var scope;
  var ctrl;

  beforeEach(function() {
    module('[module name]');
    inject(function($rootScope, $controller) {
      scope = $rootScope.$new();
      ctrl = $controller('[module name]', {$scope: scope});
    });
  });

  it('should be ordered by age', function() {
    expect(scope.orderProp).toBe('age');
  });

});

Этот метод тестирования контроллера можно найти в разделе "Контрольные контроллеры" на Понимание компонента контроллера.