Sök…


Syntax

  • dekoratör (namn, dekoratör);

Anmärkningar

Dekoratör är en funktion som gör att en service , fabrik , direktiv eller filter kan ändras innan den används. Decorator används för att åsidosätta eller ändra beteendet hos tjänsten. Returvärdet för dekoratörsfunktionen kan vara den ursprungliga tjänsten, eller en ny tjänst som ersätter, eller lindar och delegerar till, den ursprungliga tjänsten.


All dekorering måste göras i vinkelapplikationens config genom att injicera $provide och använda dess $provide.decorator funktion.

Dekoratörsfunktionen har ett $delegate objekt injicerat för att ge åtkomst till den tjänst som matchar väljaren i dekoratören. Denna $delegate är tjänsten du dekorerar. Returvärdet för den funktion som tillhandahålls till dekoratören kommer att ske när tjänsten, direktivet eller filtret dekoreras.


Man bör överväga att använda dekoratörer endast om något annat tillvägagångssätt inte är lämpligt eller visar sig vara för tråkigt. Om stor applikation använder samma tjänst och en del ändrar servicebeteende är det enkelt att skapa förvirring och / eller buggar i processen.

Ett typiskt användningsfall skulle vara när du har ett tredjepartsberoende som du inte kan uppgradera men behöver det för att fungera lite annorlunda eller förlänga det.

Dekorera service, fabrik

Nedan är ett exempel på serviceinredare, åsidosättande av null returneras av tjänsten.

angular.module('app', [])
  .config(function($provide) {
    $provide.decorator('myService', function($delegate) {
      $delegate.getDate = function() { // override with actual date object
        return new Date();
      };
      return $delegate;
    });
  })
  .service('myService', function() {
    this.getDate = function() {
      return null; // w/o decoration we'll be returning null
    };
  })
  .controller('myController', function(myService) {
    var vm = this;
    vm.date = myService.getDate();
  });

<body ng-controller="myController as vm">
  <div ng-bind="vm.date | date:'fullDate'"></div>
</body>

fullDate

Dekorera direktivet

Direktiv kan dekoreras precis som tjänster och vi kan ändra eller ersätta någon av dess funktioner. Observera att själva direktivet nås på position 0 i $ delegat-array och namnparameter i dekoratör måste innehålla Directive (skiftlägeskänsligt).

Så om direktivet kallas myDate kan det nås med myDateDirective med $delegate[0] .

Nedan är ett enkelt exempel där direktiv visar aktuell tid. Vi dekorerar det för att uppdatera aktuell tid med en sekunders intervall. Utan dekoration kommer det alltid att visas samma gång.

<body>
  <my-date></my-date>
</body>

angular.module('app', [])
  .config(function($provide) {
    $provide.decorator('myDateDirective', function($delegate, $interval) {
      var directive = $delegate[0]; // access directive

      directive.compile = function() { // modify compile fn
        return function(scope) {
          directive.link.apply(this, arguments);
          $interval(function() {
            scope.date = new Date(); // update date every second
          }, 1000);
        };
      };
      
      return $delegate;
    });
  })
  .directive('myDate', function() {
    return {
      restrict: 'E',
      template: '<span>Current time is {{ date | date:\'MM:ss\' }}</span>',
      link: function(scope) {
        scope.date = new Date(); // get current date
      }
    };
  }); 

ange bildbeskrivning här

Dekorera filter

När filter dekoreras måste Filter innehålla Filter (skiftlägeskänsligt). Om filter kallas repeat är dekoratörsparameteren repeatFilter . Nedan dekorerar vi ett anpassat filter som upprepar en given sträng n gånger så att resultatet blir omvänd. Du kan också dekorera vinkelens inbyggda filter på samma sätt, även om det inte rekommenderas eftersom det kan påverka ramens funktionalitet.

<body>
  <div ng-bind="'i can haz cheeseburger ' | repeat:2"></div>
</body>

angular.module('app', [])
  .config(function($provide) {
    $provide.decorator('repeatFilter', function($delegate) {
      return function reverse(input, count) {
        // reverse repeated string
        return ($delegate(input, count)).split('').reverse().join(''); 
      };
    });
  })
  .filter('repeat', function() {
    return function(input, count) {
      // repeat string n times
      return (input || '').repeat(count || 1);
    };
  });   

exempel1

exempel2



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow