AngularJS $watch window resize inside directive

AngularjsResizeWindowDirectiveWatch

Angularjs Problem Overview


I have revealing module pattern which looks like this:

'use strict';

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

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

What I'm having trouble with is integrating a $watch into this. Specifically watching for window resize, with the '$window' service.

[EDIT]:

I realised what my issue was this whole time... I was restricting to element, when I forgot that I was implementing it as an attribute... @_@;

Angularjs Solutions


Solution 1 - Angularjs

You shouldn't need a $watch. Just bind to resize event on window:

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

Solution 2 - Angularjs

You can listen resize event and fire where some dimension change

directive

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

Solution 3 - Angularjs

// Following is angular 2.0 directive for window re size that adjust scroll bar for give element as per your 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');
   }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLightfootedView Question on Stackoverflow
Solution 1 - AngularjsMatt HerbstrittView Answer on Stackoverflow
Solution 2 - AngularjsnguyênView Answer on Stackoverflow
Solution 3 - AngularjsNikhil TambaveView Answer on Stackoverflow