J'essayais de redimensionner une div lorsque la fenêtre était redimensionnée. Après avoir regardé autour de nous, il semblait que l'utilisation d'une directive était la meilleure solution.
Modèle:
<div elHeightResize ng-view ng-style="{ height: windowHeight }"></div>
Directif:
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();
})
}
}
}])
Bien que je puisse me connecter elem.windowHeight
dans scope.onResize
, il ne semble pas l'appliquer à ngStyle
Suis-je encore en train de négliger quelque chose?
MODIFIER:
<div ng-view resize style="height: {{ windowHeight }}px">
Cette solution semble fonctionner, toujours intéressée à savoir pourquoi l'utilisation de ngStyle
ne fonctionnait pas.
Je pense que vous avez oublié d'activer le cycle de résumé en appelant scope.$apply();
à la fin de scope.onResize
méthode
En tout cas, j’ai utilisé la directive suivante (extraite de HERE) ça marche pour moi:
Essayez d'ouvrir la vue de débogage et de modifier la hauteur de la vue: Démo 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();
});
}
});
Et utilisation:
<div ng-style="resizeWithOffset(165)"
resize
notifier="notifyServiceOnChage(params)"
>
/** ... */
</div>
Utilisation de la méthode du contrôleur factice:
$scope.notifyServiceOnChage = function(){
console.log($scope.windowHeight);
};
[EDIT]
Voici une démo sans bibliothèque jQuery en utilisant innerHeight
Démo 3Fiddle
Puisque nous travaillons avec une directive, nous pouvons toujours effectuer certaines manipulations du DOM en modifiant la hauteur de l'élément dans la directive.
Exemple:
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();
})
}
}
}])
Exemple en direct: http://jsfiddle.net/choroshin/FJvyb/
Cela fait longtemps que vous avez demandé et vous semblez avoir obtenu votre solution de contournement ... mais vous demandez également pourquoi ng-style
n'a pas fonctionné:
ng-style, à partir du Angular docs
Expression qui correspond à un objet dont les clés sont des noms de style CSS et les valeurs correspondent aux valeurs correspondantes pour ces clés CSS.
Donc, dans votre exemple de style ng, vous fournissez height : 375;
(c'est-à-dire si windowHeight est évalué à 375) et ce n'est pas une valeur appropriée.
Cela devrait être comme vous l'avez fait dans votre solution de contournement et avoir des unités.
windowHeight = ($ window.innerHeight - header.clientHeight) + "px";
Fonction de lien interne donne
scope.onResize = function() {
var header = document.getElementsByTagName('header')[0];
elem.windowHeight = $window.innerHeight - header.clientHeight;
}
$window.onresize = function(){scope.onResize();scope.$apply();}
Un minimaliste dans CoffeeScript:
app.directive "applyOnResize", ($window) ->
($scope, $element) ->
$element($window).bind("resize", $scope.$apply)
Voici une autre version sans utiliser angular $ watch et je veux juste regarder le changement de taille de la fenêtre:
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')
});