2015-07-25 53 views
40

mam odsłaniając moduł wzór, który wygląda tak:

'use strict'; 

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

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

Co mam problemy z integruje dolarów zegarek do tego. Szczególnie obserwując zmianę rozmiaru okna za pomocą usługi "$ window".

[EDIT]:

zdałem sobie sprawę, co mój problem był ten cały czas ... Ja ograniczając się do elementu, gdy zapomniałem, że jestem jej wykonania jako atrybut ... @ _ @ ;

+0

Jeśli znalazłeś rozwiązanie, które nie jest oferowane poniżej, zapewnić i zaakceptować odpowiedź więc to stanowisko może zostać rozwiązany. Nie odpowiadaj na pytanie w samym pytaniu. – isherwood

Odpowiedz

74

Nie powinieneś potrzebować zegarka $. Wystarczy powiązać zdarzenie na zmianę rozmiaru okna:

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

i co jeśli ta dyrektywa nie jest już używana na stronie? po prostu wywoływać niepotrzebne wywoływanie zdarzenia przez resztę czasu dla każdego elementu dyrektywy, jaki kiedykolwiek istniał. Idź do strony z tą dyrektywą sto razy i przetwarzaj wydarzenie sto razy, bez względu na to, który szablon jest aktualnie wyświetlany ... – user3338098

+6

Jeśli chcesz zająć się czyszczeniem, gdy dyrektywa nie jest używana, zaimplementuj $ destroy w sprawie dyrektywy. http://stackoverflow.com/questions/23031381/how-to-safely-clean-up-angularjs-event-inding-in-a-irective –

+0

Twoja prostota jest bardzo cenna. –

2

// Poniżej kątowe dyrektywa 2,0 dla rozmiaru okna ponownego że dostosować pasek przewijania dla elementu podać jak za tagu

---- 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

Ty można słuchać zdarzenia resize zdarzeń i ognia, w przypadku których nastąpiła zmiana wymiaru

dyrektywa

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

w HTML

<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> 

Kontroler:

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

Brakuje w nim połączenia, aby się odłączyć i najprawdopodobniej stworzysz słuchaczy zombie, np. podczas nawigacji do innego widoku w aplikacji. – dube

+3

dzięki @dube, mam zaktualizowaną odpowiedź –