Zoeken…


Syntaxis

  • decorateur (naam, decorateur);

Opmerkingen

Decorator is een functie waarmee een service , fabriek , richtlijn of filter kan worden gewijzigd voordat deze wordt gebruikt. Decorator wordt gebruikt om het gedrag van de service te vervangen of te wijzigen. De retourwaarde van de decorateurfunctie kan de oorspronkelijke service zijn, of een nieuwe service die de oorspronkelijke service vervangt of wikkelt en delegeert.


Elke versieren moet hoekige applicatie worden gedaan config fase door het injecteren van $provide en het gebruik ervan is $provide.decorator functie.

De decorateurfunctie heeft een $delegate object geïnjecteerd om toegang te bieden tot de service die overeenkomt met de selector in de decorator. Deze $delegate zal de service zijn die je decoreert. De retourwaarde van de aan de decorateur geleverde functie vindt plaats wanneer de service, richtlijn of filter wordt gedecoreerd.


Men moet overwegen om decorateur alleen te gebruiken als een andere benadering niet geschikt is of te vervelend blijkt te zijn. Als een grote applicatie dezelfde service gebruikt en een onderdeel het servicegedrag verandert, is het eenvoudig om verwarring en / of fouten in het proces te creëren.

Typisch gebruik zou zijn wanneer u afhankelijk bent van een derde partij die u niet kunt upgraden, maar deze iets anders moet laten werken of uitbreiden.

Service versieren, fabriek

Hieronder is een voorbeeld van de dienstverlening decorateur, dwingende null datum geretourneerd door service.

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

Versier richtlijn

Richtlijnen kunnen net als services worden ingericht en we kunnen de functionaliteit ervan wijzigen of vervangen. Merk op dat de richtlijn zelf toegankelijk is op positie 0 in $ delegate array en de parameter name in decorator moet het Directive achtervoegsel bevatten (hoofdlettergevoelig).

Dus, als richtlijn myDate wordt genoemd, is deze toegankelijk via myDateDirective met $delegate[0] .

Hieronder is een eenvoudig voorbeeld waar de richtlijn de huidige tijd toont. We zullen het versieren om de huidige tijd met intervallen van één seconde bij te werken. Zonder decoratie zal het altijd dezelfde tijd weergeven.

<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
      }
    };
  }); 

voer hier de afbeeldingsbeschrijving in

Verfraai filter

Bij het decoreren van filters moet de parameter name het achtervoegsel Filter bevatten (hoofdlettergevoelig). Als filter repeat wordt genoemd, is decorateurparameter repeatFilter . Hieronder zullen we een aangepast filter versieren dat elke gegeven string n keer herhaalt, zodat het resultaat wordt omgekeerd. U kunt de ingebouwde filters van Angular ook op dezelfde manier decoreren, hoewel niet aanbevolen, omdat dit de functionaliteit van het framework kan beïnvloeden.

<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);
    };
  });   

voorbeeld 1

example2



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow