Ответ 1
Я разработал для этого решение.
Просто добавьте следующие строки в ng-grid.js внутри ng.EventProvider.
setInterval(function() {
domUtilityService.RebuildGrid($scope,grid);
}, 30);
ng-сетка с angular js не занимает 100% ширины при загрузке страницы. Вот мой код:
<tabs ng-cloak>
<pane title="Test Plan">
<tabs>
<pane title="Include Tests">
<div ng-controller="includedTestPlanGridCntrl">
<div class="gridStyle" ng-grid="gridOptions"></div>
</div>
</pane>
<pane title="Excluded Tests">
<div ng-controller="excludedTestPlanGridCntrl">
<div class="gridStyle1" ng-grid="gridOptions"></div>
</div>
</pane>
</tabs>
</pane>
<pane title="Advanced Planning">
Some text here
</pane>
</tabs>
Сетка отображается правильно, если я изменяю размер.
Я разработал для этого решение.
Просто добавьте следующие строки в ng-grid.js внутри ng.EventProvider.
setInterval(function() {
domUtilityService.RebuildGrid($scope,grid);
}, 30);
Это сработало для меня
$scope.gridOptions = {
data: 'gridData',
init:function(grid,$scope) {
setTimeout(function() {
$scope.gridOptions.$gridServices.DomUtilityService.RebuildGrid(
$scope.gridOptions.$gridScope,
$scope.gridOptions.ngGrid
);
},1000);
}
};
Замените "gridOptions" на используемую вами переменную и бинго!
Попробуйте установить ng - если включить только сетку, когда есть данные для отображения: (ng-hide не работает для меня)
<div class="gridStyle" ng-grid="gridOptions" ng-if="myViewModel.Data.length"></div>
Источник: https://github.com/angular-ui/ng-grid/issues/855
Связанный вопрос: Когда ng-сетка меняет видимость от невидимого до видимого с помощью ng-hide, ширина сетки не пересчитывается
У меня была такая же проблема, используя вкладки из Angular UI Bootstrap.
Простейшим решением является запуск события resize
в родительском элементе ng-grid,
предпочтительно, когда выбрана вкладка, содержащая ng-сетку.
ng-сетка будет правильно изменять размеры этого события.
Используйте что-то вроде этого:
function onTabSelect() {
$('.grid-container').trigger('resize');
}
Вы можете использовать сетки ngGridLayoutPlugin (найденные здесь) и вызвать его в функции инициализации контроллеров.
var layoutPlugin = new ngGridLayoutPlugin();
$scope.init = function() {
$scope.gridOptions = {
plugins: [layoutPlugin],
};
window.setTimeout(function(){
layoutPlugin.updateGridLayout();
}, 100);
};
Если у вас есть обработчик после загрузки сетки, вы можете вызвать метод, который на самом деле повторно отображает сетку при изменении размера окна.
gridApi.core.handleWindowResize()
Это может помочь вам при каждом вызове события изменения размера вручную.
Это изменение будет намного лучше с точки зрения загрузки процессора.
Линия 2904
Из этого:
// we have to set this to false in case we want to autogenerate columns with no initial data.
grid.lateBoundColumns = false;
$scope.columns = [];
grid.config.columnDefs = a;
grid.buildColumns();
grid.configureColumnWidths();
grid.eventProvider.assignEvents();
domUtilityService.RebuildGrid($scope, grid);
}, true);
Для этого:
// we have to set this to false in case we want to autogenerate columns with no initial data.
grid.lateBoundColumns = false;
$scope.columns = [];
grid.config.columnDefs = a;
grid.buildColumns();
grid.configureColumnWidths();
grid.eventProvider.assignEvents();
setTimeout(function() {domUtilityService.RebuildGrid($scope,grid);}, 1);
}, true);
В моем случае я переместил скрипты библиотеки ng-grid после всех скриптов, которые изменили дерево DOM.
Другими словами:
с проблемой:
<script type="text/javascript" src="ng-grid-2.0.7.min.js"></script>
<script src="jquery.mmenu.min.all.js"></script>
исправить проблему:
<script src="jquery.mmenu.min.all.js"></script>
<script type="text/javascript" src="ng-grid-2.0.7.min.js"></script>
Надеюсь, это спасет кого-то еще, когда я потрачу на работу в сценариях, где это все еще проблема. Для меня моя последняя ширина столбца была "*", и обрезание не является проблемой, поэтому использование обертки div работает. Меня также не интересовало решение тайм-аута javascript.
HTML:
<div class="gridWidthWrapper">
<div class="gridStyle" ng-grid="gridOptions"></div>
</div>
Контроллер:
$scope.gridOptions = {
data: 'dataList',
columnDefs: [{field: 'type', displayName: 'Type', width: 120},
{field: 'description', displayName: 'Description', width: '*'}]
};
CSS
.gridWidthWrapper {
width: 100%;
overflow: hidden;
}
.gridStyle {
/* width: 100%; --- 100% not sizing on load - using gridWidthWrapper class to obtain 100% */
width: 2000px;
height: 150px;
}
Вы все сложны, это не лучший способ внести изменения в исходный код.
Просто добавьте в div
data-ng-show="myData.length"
Где myData является источником данных Grid, убедитесь, что загрузка данных асинхронизирована или задано значение $timeout для метода данных загрузки.
Я знаю, что у ngGrid есть метод под названием getPagedDataAsync
, назовем его из документа JQuery готовым, некоторые вроде этого:
$(function(){
getPagedDataAsync(...)
});
Если вы не являетесь пейджинговыми данными, просто вызовите свой метод загрузки пользовательских данных из документа JQuery.
Надеюсь, это поможет:)
Привет