Window resize指令

时间:2014-04-13 15:06:13

标签: angularjs resize window

我试图在窗口调整大小时调整div大小,在环顾四周之后,似乎使用指令是最佳解决方案。

模板:

<div elHeightResize ng-view ng-style="{ height: windowHeight }"></div>

指令:

myApp.directive('elheightresize', ['$window', function($window) {
    return {
        link: function(scope, elem, attrs) {
            scope.onResize = function() {
                var header = document.getElementsByTagName('header')[0];
                elem.windowHeight = $window.innerHeight - header.clientHeight;
            }
            scope.onResize();

            angular.element($window).bind('resize', function() {
                scope.onResize();
            })
        }
    }
}])

虽然我可以在elem.windowHeight中记录scope.onResize,但它似乎无法将其应用于ngStyle

我还在忽视什么吗?

编辑:

<div ng-view resize style="height: {{ windowHeight }}px">

此解决方案似乎有效,仍然对使用ngStyle无效的原因感兴趣。

6 个答案:

答案 0 :(得分:47)

我认为您忘记在scope.$apply();方法结束时调用scope.onResize来解除摘要周期

无论如何,我使用了以下指令(取自 HERE ),对我有用:

尝试打开调试视图并更改视图高度:演示 Fiddle

app.directive('resize', function ($window) {
    return function (scope, element, attr) {

        var w = angular.element($window);
        scope.$watch(function () {
            return {
                'h': w.height(), 
                'w': w.width()
            };
        }, function (newValue, oldValue) {
            scope.windowHeight = newValue.h;
            scope.windowWidth = newValue.w;

            scope.resizeWithOffset = function (offsetH) {

                scope.$eval(attr.notifier);

                return { 
                    'height': (newValue.h - offsetH) + 'px'
                    //,'width': (newValue.w - 100) + 'px' 
                };
            };

        }, true);

        w.bind('resize', function () {
            scope.$apply();
        });
    }
}); 

用法:

 <div  ng-style="resizeWithOffset(165)" 
       resize 
        notifier="notifyServiceOnChage(params)"
   >
    /** ... */
 </div>

虚拟控制器方法用法:

$scope.notifyServiceOnChage = function(){
      console.log($scope.windowHeight);   
 };

<强> [编辑]

这是使用innerHeight

的没有jQuery库的demo

演示3 Fiddle

答案 1 :(得分:7)

由于我们使用指令,我们总是可以通过更改指令内元素的高度来进行一些DOM操作。

示例:

var app=angular.module('App', []);
app.directive('elheightresize', ['$window', function($window) {
    return {
        link: function(scope, elem, attrs) {
            scope.onResize = function() {
                var header = document.getElementsByTagName('header')[0];
                elem.windowHeight = $window.innerHeight - header.clientHeight;
                $(elem).height(elem.windowHeight);
            }
            scope.onResize();

            angular.element($window).bind('resize', function() {
                scope.onResize();
            })
        }
    }
}])

实例:http://jsfiddle.net/choroshin/FJvyb/

答案 2 :(得分:5)

已经有一段时间了,因为你问过,你似乎已经得到了你的解决方案...... 但你也问为什么ng-style不起作用:

ng-style,来自Angular docs

  

对于其键为CSS样式名称和值的对象的表达式是这些CSS键的对应值。

所以在你提供的ng风格的例子中 height : 375;  (即如果windowHeight评估为375)并且这不是正确的值。

应该像你在你的解决方法中完成并拥有单位。

  

windowHeight =($ window.innerHeight - header.clientHeight)+“px”;

答案 3 :(得分:3)

内部链接功能提供

scope.onResize = function() {
            var header = document.getElementsByTagName('header')[0];
            elem.windowHeight = $window.innerHeight - header.clientHeight;
        }


$window.onresize = function(){scope.onResize();scope.$apply();}

答案 4 :(得分:2)

CoffeeScript中的极简主义:

app.directive "applyOnResize", ($window) ->
  ($scope, $element) ->
    $element($window).bind("resize", $scope.$apply)

Same in Javascript

答案 5 :(得分:0)

这是另一个版本,没有使用angular $ watch,只想观看窗口大小的变化:

function resize () {

        var windowHeight = window.innerHeight,
            windowWidth  = window.innerWidth;

        scope.windowHeight = windowHeight;
        scope.windowWidth  = windowWidth;

        console.log('w.innerHeight', windowHeight);
        console.log('w.innerWidth', windowWidth);

        //** If want to apply style on element, can do something like:
        var elemStyle = {
            width: windowWidth + 'px',
            height: windowHeight + 'px'
        };

        element.css(elemStyle);
    }       
    resize();

    //** On resize
    window.onresize = function () {
        resize();
        scope.$apply();
    }

    //** Destroy
    scope.$on('$destory', function () {
        window.off('resize')
    });  

Fiddle