2015-07-25 11 views
40

अंदर का आकार बदलने मैं खुलासा मॉड्यूल पैटर्न जो इस तरह दिखता है:

'use strict'; 

angular.module('app', []) 
    .directive('myDirective', ['SomeDep', function (SomeDep) { 
     var linker = function (scope, element, attr) { 
      // some work 
     }; 

     return { 
      link: linker, 
      restrict: 'E' 
     }; 
    }]) 
; 

क्या मैं के साथ इस में एक $ घड़ी को एकीकृत है परेशानी आ रही है। विशेष रूप से '$ विंडो' सेवा के साथ विंडो आकार बदलने के लिए देख रहे हैं।

[संपादित करें]:

मैंने महसूस किया कि मेरी इस मुद्दे को इस पूरे समय था ... मैं तत्व को सीमित किया गया था, जब मैं भूल गया था कि मैं एक विशेषता के रूप में यह लागू करने गया था ... @ _ @ ;

+0

आप एक समाधान है कि नीचे की पेशकश नहीं कर रहा है, प्रदान करते हैं और एक जवाब स्वीकार तो इस पोस्ट हल किया जा सकता पाया गया है। प्रश्न में एक प्रश्न का उत्तर न दें। – isherwood

उत्तर

74

आपको $ घड़ी की आवश्यकता नहीं है। बस की खिड़की पर घटना का आकार बदलने के लिए बाध्य:

DEMO

'use strict'; 

var app = angular.module('plunker', []); 

app.directive('myDirective', ['$window', function ($window) { 

    return { 
     link: link, 
     restrict: 'E', 
     template: '<div>window size: {{width}}px</div>' 
    }; 

    function link(scope, element, attrs){ 

     scope.width = $window.innerWidth; 

     angular.element($window).bind('resize', function(){ 

     scope.width = $window.innerWidth; 

     // manuall $digest required as resize event 
     // is outside of angular 
     scope.$digest(); 
     }); 

    } 

}]); 
+9

और क्या होगा यदि उस निर्देश का उपयोग पृष्ठ पर अब नहीं किया जा रहा है? बस घटना कॉलबैक को हमेशा के लिए मौजूद प्रत्येक निर्देश तत्व के लिए शेष समय के लिए अनिवार्य रूप से निकाल दिया गया है। इस निर्देश के साथ एक पृष्ठ पर एक सौ बार जाएं और इस कार्यक्रम को एक सौ बार संसाधित किया गया है, इस पर ध्यान दिए बिना कि कौन सा टेम्पलेट वर्तमान में प्रदर्शित हो रहा है ... – user3338098

+6

यदि आप उपयोग में नहीं होने पर सफाई की देखभाल करना चाहते हैं, तो $ नष्ट करें निर्देश पर http://stackoverflow.com/questions/23031381/how-to-safely-clean-up-angularjs-event-binding-in-a- डायरेक्टिव –

+0

आपकी सादगी की बहुत सराहना की जाती है। –

2

// के बाद ही आपके टैग के अनुसार दे तत्व के लिए स्क्रॉल पट्टी को समायोजित खिड़की फिर से आकार के लिए कोणीय 2.0 निर्देश है

---- angular 2.0 window resize directive. 
import { Directive, ElementRef} from 'angular2/core'; 

@Directive({ 
     selector: '[resize]', 
     host: { '(window:resize)': 'onResize()' } // Window resize listener 
}) 

export class AutoResize { 

element: ElementRef; // Element that associated to attribute. 
$window: any; 
     constructor(_element: ElementRef) { 

     this.element = _element; 
     // Get instance of DOM window. 
     this.$window = angular.element(window); 

     this.onResize(); 

    } 

    // Adjust height of element. 
    onResize() { 
     $(this.element.nativeElement).css('height', (this.$window.height() - 163) + 'px'); 
    } 
} 
34

आप resize घटना और आग सुन सकते हैं जहां कुछ आयाम बदलते हैं

निर्देश

(function() { 
'use strict'; 

    angular 
    .module('myApp.directives') 
    .directive('resize', ['$window', function ($window) { 
     return { 
      link: link, 
      restrict: 'A' 
     }; 

     function link(scope, element, attrs){ 
      scope.width = $window.innerWidth; 
      function onResize(){ 
       // uncomment for only fire when $window.innerWidth change 
       // if (scope.width !== $window.innerWidth) 
       { 
        scope.width = $window.innerWidth; 
        scope.$digest(); 
       } 
      }; 

      function cleanUp() { 
       angular.element($window).off('resize', onResize); 
      } 

      angular.element($window).on('resize', onResize); 
      scope.$on('$destroy', cleanUp); 
     } 
    }]); 
})(); 

एचटीएमएल में

<div class="row" resize> , 
    <div class="col-sm-2 col-xs-6" ng-repeat="v in tag.vod"> 
     <h4 ng-bind="::v.known_as"></h4> 
    </div> 
</div> 

नियंत्रक:

$scope.$watch('width', function(old, newv){ 
    console.log(old, newv); 
}) 
+3

इसमें अनबाइंड करने के लिए कॉल की कमी है और ज़ोंबी श्रोताओं को बनाने की संभावना अधिक होगी, उदा। ऐप के अंदर एक अलग दृश्य पर नेविगेट करते समय। – dube

+3

धन्यवाद @dube, मैंने उत्तर अपडेट किया है –

संबंधित मुद्दे