我试图在窗口调整大小时调整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
无效的原因感兴趣。
答案 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
演示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();
})
}
}
}])
答案 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)
答案 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')
});