Angular.js:在页面加载时设置元素高度

IT技术 javascript angularjs
2021-03-13 02:16:03

我是 AngularJS 新手。我想创建高度取决于窗口高度的网格(使用ng-grid)。$('.gridStyle').height($(window).height() - 100);

我写了指令:

app.directive('resize', function($window) {

    return function(scope, element) {

        function applyHeight() {
            scope.height = $window.innerHeight;
            $('.gridStyle').height(scope.height - 100);
        }

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

        applyHeight();
    };
});

当我调整浏览器窗口的大小但第一次加载站点时不应用样式时,这很有效。我在哪里可以放置代码来初始化高度?

6个回答

我在为自己寻找解决同一问题的方法时看到了您的帖子。我使用基于许多帖子的指令将以下解决方案放在一起。您可以在这里尝试(尝试调整浏览器窗口的大小):http : //jsfiddle.net/zbjLh/2/

看法:

<div ng-app="miniapp" ng-controller="AppController" ng-style="style()" resize>
    window.height: {{windowHeight}} <br />
    window.width: {{windowWidth}} <br />
</div>

控制器:

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

function AppController($scope) {
    /* Logic goes here */
}

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

            scope.style = function () {
                return { 
                    'height': (newValue.h - 100) + 'px',
                    'width': (newValue.w - 100) + 'px' 
                };
            };

        }, true);

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

仅供参考,我最初让它在控制器(http://jsfiddle.net/zbjLh/)中工作,但从随后的阅读中发现,从 Angular 的角度来看,这并不酷,所以我现在已将其转换为使用指令。

重要的是,请注意true'watch' 函数末尾标志,用于比较 getWindowDimensions 返回对象的相等性(如果不使用对象,则删除或更改为 false)。

据我了解,为了一次观察多个值(即窗口的“宽度”和“高度”),您需要观察一个函数(因此需要有观察函数标志(最后一个参数) ) 设置为“真”))。如果您只想观察一维或一个值,则不需要函数。
2021-04-21 02:16:03
@MattyJ 你可以观看“{a:b, c: d}”的动态表达,还有 $watchGroup 以 1.3 的形式出现
2021-05-08 02:16:03
你正在使用$watch一个函数不是很糟糕吗?据我了解,即使窗口没有调整大小scope.getWindowDimensions()也会在每个$digest周期调用
2021-05-12 02:16:03
2021-05-14 02:16:03
@n1313 观看功能完全正常
2021-05-15 02:16:03

为了避免检查每个摘要周期,我们可以在窗口高度改变时改变 div 的高度。

http://jsfiddle.net/zbjLh/709/

<div ng-app="miniapp" resize>
  Testing
</div>

.

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

app.directive('resize', function ($window) {
    return function (scope, element) {
        var w = angular.element($window);
        var changeHeight = function() {element.css('height', (w.height() -20) + 'px' );};  
            w.bind('resize', function () {        
              changeHeight();   // when window size gets changed             
        });  
        changeHeight(); // when page loads          
    }
})
angular.element(document).ready(function () {
    //your logic here
});

对 Bizzard 的出色回答略有改进。支持元素上的宽度偏移和/或高度偏移,以确定将从宽度/高度中减去多少,并防止负尺寸。

 <div resize height-offset="260" width-offset="100">

指示:

app.directive('resize', ['$window', function ($window) {
    return function (scope, element) {
        var w = angular.element($window);
        var heightOffset = parseInt(element.attr('height-offset'));
        var widthOffset = parseInt(element.attr('width-offset'));
        var changeHeight = function () {
            if (!isNaN(heightOffset) && w.height() - heightOffset > 0)
                element.css('height', (w.height() - heightOffset) + 'px');
            if (!isNaN(widthOffset) && w.width() - widthOffset > 0)
                element.css('width', (w.width() - widthOffset) + 'px');
        };
        w.bind('resize', function () {
            changeHeight();
        });
        changeHeight();
    }
}]);

编辑 这在现代浏览器中实际上是一种愚蠢的做法。CSS3 有 calc,它允许在 CSS 中指定计算,像这样:

#myDiv {
 width: calc(100% - 200px);
 height: calc(100% - 120px);
}

http://caniuse.com/#search=calc

看来您需要以下插件:https : //github.com/yearofmoo/AngularJS-Scope.onReady

它基本上为您提供了在加载范围或数据后运行指令代码的功能,即 $scope.$whenReady