खोज…


वाक्य - विन्यास

  • डेकोरेटर (नाम, डेकोरेटर);

टिप्पणियों

डेकोरेटर वह फ़ंक्शन है जो किसी सेवा , कारखाने , निर्देश या फ़िल्टर को इसके उपयोग से पहले संशोधित करने की अनुमति देता है। डेकोरेटर का उपयोग सेवा के व्यवहार को ओवरराइड या संशोधित करने के लिए किया जाता है। डेकोरेटर फ़ंक्शन का वापसी मूल्य मूल सेवा, या एक नई सेवा हो सकती है, जो मूल सेवा को प्रतिस्थापित या रैप करती है और प्रतिनिधि बनाती है।


किसी भी सजा को कोणीय अनुप्रयोग के config चरण में $provide और $provide.decorator करना है।

डेकोरेटर फ़ंक्शन सेलेक्टर में चयनकर्ता से मेल खाने वाली सेवा तक पहुँच प्रदान करने के लिए इंजेक्ट किए $delegate एक $delegate ऑब्जेक्ट है। यह $delegate वह सेवा होगी जिसे आप सजा रहे हैं। डेकोरेटर को प्रदान किए गए फ़ंक्शन का रिटर्न वैल्यू सजाया जा रहा है, सेवा, निर्देश, या फिल्टर का स्थान लेगा।


किसी को केवल डेकोरेटर का उपयोग करने पर विचार करना चाहिए यदि कोई अन्य दृष्टिकोण उचित नहीं है या बहुत थकाऊ साबित होता है। यदि बड़े अनुप्रयोग समान सेवा का उपयोग कर रहे हैं, और एक भाग सेवा व्यवहार को बदल रहा है, तो प्रक्रिया में भ्रम और / या बग बनाना आसान है।

विशिष्ट उपयोग मामला तब होगा जब आपके पास तृतीय पक्ष निर्भरता होगी जिसे आप अपग्रेड नहीं कर सकते हैं, लेकिन इसे थोड़ा अलग तरीके से काम करने या इसे विस्तारित करने की आवश्यकता है।

सजाने सेवा, कारखाने हैं

नीचे सेवा डेकोरेटर का उदाहरण है, सेवा द्वारा वापस ली गई null तिथि को ओवरराइड करना।

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

निर्देशन सजाने

निर्देशों को सेवाओं की तरह सजाया जा सकता है और हम इसकी किसी भी कार्यक्षमता को संशोधित या बदल सकते हैं। ध्यान दें कि निर्देश स्वयं $ डेलिगेट सरणी में स्थिति 0 पर पहुँचा है और डेकोरेटर में नाम पैरामीटर को Directive प्रत्यय (मामला संवेदनशील) शामिल होना चाहिए।

इसलिए, अगर निर्देश को myDate कहा जाता है, तो इसे $delegate[0] का उपयोग करके myDateDirective का उपयोग करके एक्सेस किया जा सकता है।

नीचे सरल उदाहरण है जहां निर्देशन वर्तमान समय दिखाता है। हम इसे एक सेकंड के अंतराल में वर्तमान समय को अपडेट करने के लिए सजाएंगे। सजावट के बिना यह हमेशा एक ही समय दिखाएगा।

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

यहाँ छवि विवरण दर्ज करें

फ़िल्टर को सजाने

फ़िल्टर को सजाते समय, नाम पैरामीटर में Filter प्रत्यय (केस संवेदी) शामिल होना चाहिए। यदि फ़िल्टर को repeat कहा जाता है, तो डेकोरेटर पैरामीटर repeatFilter । नीचे हम कस्टम फ़िल्टर को सजाएंगे जो किसी भी दिए गए स्ट्रिंग को n बार दोहराता है ताकि परिणाम उलटा हो। आप कोणीय के बिल्ड-इन फ़िल्टर को भी उसी तरह से सजा सकते हैं, हालांकि इसकी अनुशंसा नहीं की जाती है क्योंकि यह फ्रेमवर्क की कार्यक्षमता को प्रभावित कर सकता है।

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

उदाहरण 1

example2



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow