2015-07-25 58 views
40

Ho modello modulo rivelatore che assomiglia a questo:

'use strict'; 

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

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

Quello che sto avendo problemi con è l'integrazione di un orologio $ in questo. In particolare guardando per ridimensionare le finestre, con il servizio '$ window'.

[EDIT]:

ho capito che cosa il mio problema è stato per tutto questo tempo ... stavo limitando al elemento, quando ho dimenticato che ero sua attuazione come attributo ... @ _ @ ;

+0

Se hai trovato una soluzione che non è offerto di seguito, fornire e accettare una risposta quindi questo post può essere risolto. Non rispondere a una domanda nella domanda stessa. – isherwood

risposta

74

Non è necessario un orologio $. Basta legarsi a ridimensionare evento sulla finestra:

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

e cosa succede se quella direttiva non è più in uso nella pagina? basta che il callback dell'evento sia stato licenziato inutilmente per il resto del tempo per ogni elemento direttivo che sia mai esistito. Vai a una pagina con questa direttiva cento volte e fai processare l'evento cento volte indipendentemente dal modello attualmente visualizzato ... – user3338098

+6

Se vuoi occuparti di ripulire quando la direttiva non è in uso, implementa $ destroy sulla direttiva. http://stackoverflow.com/questions/23031381/how-to-safely-clean-up-angularjs-event-binding-in-a-directive –

+0

La tua semplicità è molto apprezzata. –

2

// seguito è angolare direttiva 2.0 per la dimensione della finestra re che regola barra di scorrimento per l'elemento dare secondo il vostro tag

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

È può ascoltare resize evento e sparare dove alcune variazioni di dimensione

direttiva

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

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

Controller:

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

a questo manca una chiamata per dissipare e molto probabilmente creerà ascoltatori di zombi, ad es. durante la navigazione verso una vista diversa all'interno dell'app. – dube

+3

grazie @dube, ho aggiornato la risposta –