Angular.js: установить высоту элемента при загрузке страницы
Я новичок в 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();
};
});
Это хорошо работает при изменении размера окна браузера, но стиль не применяется, когда сайт загружается в первый раз. Где я могу поставить код для инициализации высоты?
Ответы
Ответ 1
Я наткнулся на ваш пост, поскольку искал решение этой проблемы для себя. Я собрал следующее решение, используя директиву, основанную на ряде сообщений. Вы можете попробовать его здесь (попробуйте изменить размер окна браузера): 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();
});
}
})
FYI Я изначально работал над контроллером (http://jsfiddle.net/zbjLh/), но из последующего чтения выяснилось, что это не нравится с точки зрения Angular, поэтому у меня есть теперь преобразовал его для использования директивы.
Обратите внимание на флаг true
в конце функции "смотреть", для сравнения равенства возвращаемого объекта getWindowDimensions (удалите или измените на false, если не используете объект).
Ответ 2
Чтобы избежать проверки каждого цикла дайджеста, мы можем изменить высоту 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
}
})
Ответ 3
angular.element(document).ready(function () {
//your logic here
});
Ответ 4
Небольшое улучшение превосходного ответа 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();
}
}]);
Edit
На самом деле это глупый способ сделать это в современных браузерах. CSS3 имеет значение calc, которое позволяет вычислять значение в CSS, например:
#myDiv {
width: calc(100% - 200px);
height: calc(100% - 120px);
}
http://caniuse.com/#search=calc
Ответ 5
Кажется, вам нужен следующий плагин:
https://github.com/yearofmoo/AngularJS-Scope.onReady
В основном это дает вам возможность запускать ваш код директивы после того, как ваша область или данные загружены, т.е. $scope. $whenReady
Ответ 6
Объединив matty-j предложение с фрагментом вопроса, я закончил этот код, сосредоточившись на изменении размера сетки после загрузки данных.
HTML:
<div ng-grid="gridOptions" class="gridStyle"></div>
Директива:
angular.module('myApp.directives', [])
.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) {
// resize Grid to optimize height
$('.gridStyle').height(newValue.h - 250);
}, true);
w.bind('resize', function () {
scope.$apply();
});
}
});
Контроллер:
angular.module('myApp').controller('Admin/SurveyCtrl', function ($scope, $routeParams, $location, $window, $timeout, Survey) {
// Retrieve data from the server
$scope.surveys = Survey.query(function(data) {
// Trigger resize event informing elements to resize according to the height of the window.
$timeout(function () {
angular.element($window).resize();
}, 0)
});
// Configure ng-grid.
$scope.gridOptions = {
data: 'surveys',
...
};
}
Ответ 7
Мое решение, если ваша ng-сетка зависит от родительского элемента (div, layout):
директива
myapp.directive('sizeelement', function ($window) {
return{
scope:true,
priority: 0,
link: function (scope, element) {
scope.$watch(function(){return $(element).height(); }, function(newValue, oldValue) {
scope.height=$(element).height();
});
}}
})
sample html
<div class="portlet box grey" style="height: 100%" sizeelement>
<div class="portlet-title">
<h4><i class="icon-list"></i>Articles</h4>
</div>
<div class="portlet-body" style="height:{{height-34}}px">
<div class="gridStyle" ng-grid="gridOrderLine" ="min-height: 250px;"></div>
</div>
</div>
height-34: 34 - фиксированная высота моего заголовка div, вы можете исправить другую высоту.
Это простая директива, но она отлично работает.
Ответ 8
$(document).ready(function() {
scope.$apply(function() {
applyHeight();
});
});
Это также гарантирует, что все сценарии были загружены до выполнения операторов. Если вам не нужно, что вы можете использовать
$(window).load(function() {
scope.$apply(function() {
applyHeight();
});
});