AngularJS — Зачем использовать анонимный контроллер в директиве?

#javascript #angularjs #controller #directive #anonymous

#javascript #angularjs #контроллер #директива #Аноним

Вопрос:

Это мой источник информации:

«Опция controllerAs позволяет нам установить псевдоним контроллера, что позволяет нам публиковать наш контроллер под этим именем и предоставляет доступ к области действия имени controllerAs. Этот шаг позволяет нам ссылаться на контроллер изнутри представления и даже позволяет нам вводить $scope .

Этот вариант может показаться тривиальным, но он дает нам много возможностей в том, как мы можем использовать и создавать анонимные контроллеры в наших маршрутизаторах и директивах. Эта мощь позволяет нам создавать динамические объекты как контроллеры, которые изолированы и просты в тестировании.

Например, мы можем создать анонимный контроллер в директиве следующим образом: »

 var myApp = angular.module("myApp",[]);
myApp.directive('myDirective', function(){
  return{
    restrict: 'A',
    template: '<h4> {{myController.msg}} </h4>',
    controllerAs: 'myController',
    controller: function(){
      this.msg = "Hello world";
    }
  };
});
 

Какова функциональность анонимных контроллеров?

Ответ №1:

Эквивалентный код без контроллеров будет выглядеть примерно так:

 var myApp = angular.module("myApp",[]);
myApp.directive('myDirective', function(){
  return{
    restrict: 'A',
    template: '<h4> {{myController.msg}} </h4>',
    controller: function($scope){
      $scope.myController = this;
      this.msg = "Hello world";
    };
});
 

Вы можете использовать что-то подобное, чтобы улучшить пространство имен для вложенных директив. Итак, если у вас есть родительский и дочерний контроллеры, вместо того, чтобы указывать свойство типа ‘name’ в области видимости каждого, вы можете присвоить имя фактическому контроллеру (this.name = ‘имя’), а затем получить доступ к этим именам из контроллеров, назначенных области:

 myApp.directive('myParentDirective', function(){
  return{
    restrict: 'A',
    template: '<div class="parent"><div my-child></div></div>',
    controllerAs: 'parent'
    controller: function($scope){
      this.name = "parent";
  };
}).directive('myChildDirective', function(){
  return{
    restrict: 'A',
    template: '<div class="child">parent name ="{{ parent.name }}"</div>'  
              '<div class="child">child name = "{{ child.name }}"</div>',
    controllerAs: 'child'
    controller: function($scope){
    this.name = "child";
  };
});
 

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

1. 1. Нет необходимости вводить $scope для получения поведения «анонимного контроллера». 2. Почему говорится, что этот способ легче тестировать?

2. 3. Необходимо ли, чтобы директивы были вложенными, чтобы воспользоваться преимуществами этой функциональности. Какой может быть другой случай? 4. При вложении область действия: (true- false- {}) взаимодействует с этой функциональностью, наследуя или нет область действия контроллера?

3. 1) Вы все равно можете ввести область действия в контроллер; в противном случае вы не смогли бы получить доступ к родительскому элементу из дочернего контроллера в моем примере. 2) IMO более ясно, откуда взялись свойства, если они имеют префикс с именем контроллера; в противном случае они могли быть получены из любого места в наследовании $scope .

4. 3) Как я показываю в первом примере, это эквивалентно присвоению контроллера $scope . Поэтому в любое время, когда вы можете получить доступ к области видимости (например, используя element.scope()), вы можете воспользоваться controllerAs . 4) Применяются обычные правила определения области видимости, поэтому вам нужно будет использовать область изоляции для вашей директивы, если вы хотите, чтобы опция определяла родственные элементы директивы без конфликта.