【问题标题】:How do I dynamically change ng-grid table size when parent containing div size changes?当包含 div 大小的父级更改时,如何动态更改 ng-grid 表大小?
【发布时间】:2014-03-21 23:51:52
【问题描述】:

我正在使用 ng-class 和一个评估是否显示编辑表单的表达式来更改包含 div 的大小。如果显示编辑表单,我想更改包含 ng-grid 和 ng-grid 本身的 div 的大小。

<div class=" row-fluid">
    <div ng-class="{'span7' : displayEditForm == true, 'span12': displayEditForm == false}" >
        <ul class="nav nav-tabs" style="margin-bottom: 5px;">
            <li class="active"><a href="#" ng-click="getActivitiesThatNeedMyApproval()" data-toggle="tab">Activities Needing My Approval</a></li>
            <li><a href="#" ng-click="getMyActivitiesNeedingApproval()" data-toggle="tab">My Activities Needing Approval </a></li>
            <li><a href="#" ng-click="getMyActivities()" data-toggle="tab">My Activities</a></li>
        </ul>
       <div class="edus-admin-manage-grid span12"  style="margin-left:0;" ng-grid="gridOptions"></div>
    </div>
    <div class="span5" ng-show="displayEditForm">
        <div class="edus-activity-container">
            <div class="edus-admin-activities-grid">
                <div ng-include="'/partials/' + activity.object.objectType + '.html'" class="edus-activity"></div>
                <!--  <div ng-include="'/partials/admin-activity-actions.html'"></div>-->
            </div>
        </div>
        <div ng-include="'/partials/admin-edit-activity-grid-form.html'"></div>
    </div>
</div>

包含导航栏和网格的 div 通过 ng-class 更改大小(从 span12 到 span7),但 ng-grid 不会刷新。考虑到父 div 的变化,如何触发 ng-grid 的刷新?

我在下面包含了我的 gridOptions:

$scope.gridOptions = {
plugins: [gridLayoutPlugin],
data : 'activities',
showFilter: true,
/*    enablePaging: true,*/
showColumnMenu: true,
/*  showFooter: true,*/
rowHeight: 70,
enableColumnResize: true,
multiSelect: false,
selectedItems: $scope.selectedActivities,
afterSelectionChange: function(rowItem,event){
   if($scope.selectedActivities && $scope.selectedActivities.length > 0){
        $scope.activity = $scope.selectedActivities[0];
        $scope.activityViewState.index = $scope.activities.indexOf($scope.activity);
        $scope.displayEditForm = true;
        console.log("DEBUG :::::::::::::::: updated displayEditForm.",            $scope.displayEditForm);

                        if($scope.activity.ucdEdusMeta.startDate) {

                           // $scope.activity.ucdEdusMeta.startDate = new Date($scope.activity.ucdEdusMeta.startDate);
                            $scope.edit.startDate = moment($scope.activity.ucdEdusMeta.startDate).format("MM/DD/YYYY");
                            $scope.edit.startTime = moment($scope.activity.ucdEdusMeta.startDate).format("hh:mm A");
                        }

                        if($scope.activity.ucdEdusMeta.endDate) {

                           // $scope.activity.ucdEdusMeta.endDate = new Date($scope.activity.ucdEdusMeta.endDate);
                            $scope.edit.endDate = moment($scope.activity.ucdEdusMeta.endDate).format("MM/DD/YYYY");
                            $scope.edit.endTime = moment($scope.activity.ucdEdusMeta.endDate).format("hh:mm A");
                        }

                    }
                },
       /* pagingOptions: { pageSizes: [5, 10, 20], pageSize: 10, totalServerItems: 0, currentPage: 1 },*/
       columnDefs: [
            {field: 'title', displayName: 'Title', width:'15%',
                        cellTemplate: '<div class="ngCellText", style="white-space: normal;">{{row.getProperty(col.field)}}</div>'},
            {field: 'actor.displayName', displayName: 'DisplayName', width:'10%',
                        cellTemplate: '<div class="ngCellText", style="white-space: normal;">{{row.getProperty(col.field)}}</div>'},
            {field: 'object.content', displayName:'Content', width:'35%',
                        cellTemplate: '<div class="ngCellText", style="white-space: normal;">{{row.getProperty(col.field)}}</div>'},
            {field: 'ucdEdusMeta.startDate', displayName: 'Start Date', width:'20%',
                        cellTemplate: '<div class="ngCellText" ng-class="col.colIndex()"><span ng-cell-text>{{row.getProperty(col.field) | date:"short"}} </span></div>'},
            {field: 'ucdEdusMeta.endDate', displayName: 'End Date', width:'20%',
                        cellTemplate: '<div class="ngCellText" ng-class="col.colIndex()"><span ng-cell-text>{{row.getProperty(col.field) | date:"short"}} </span></div>'}
          // {field: '', displayName: ''},
          ]
};

这是网格使用的 CSS:

.edus-admin-manage-grid {
    border: 1px solid rgb(212,212,212);
    width: 100%;
    height: 700px
}

【问题讨论】:

  • 有一种方法可以在 ng-grid 的 ng-grid-layout 插件的帮助下做到这一点。

标签: html css angularjs twitter-bootstrap


【解决方案1】:

您可以使用 ng-grid 的布局插件 (ng-grid-layout.js)。它应该带有 ngGrid,位于:

ng-grid/plugins/ng-grid-layout.js

(更新:现在https://github.com/angular-ui/ng-grid/blob/2.x/plugins/ng-grid-layout.js

您必须在主 index.html 文件中包含一个指向该 js 文件的附加脚本标记。并且包含 this 与 ng-grid.js 的顺序很重要。

您必须在 displayEditForm 上设置监视,然后调用插件的 updateGridLayout() 函数。

所以应该是这样的:

var gridLayoutPlugin = new ngGridLayoutPlugin();

// include this plugin with your grid options
$scope.gridOptions = {
    // your options and:
    plugins: [gridLayoutPlugin]
};

// make sure grid redraws itself whenever
// the variable that ng-class uses has changed:
$scope.$watch('displayEditForm', function() {
    gridLayoutPlugin.updateGridLayout();
});

据我了解,手表通常属于link 函数而不是控制器,但它可以在任一位置工作。你也可以更进一步说:

$scope.$watch('displayEditForm', function(newVal, oldVal) {
    if (newVal !== undefined && newVal !== oldVal) {
        gridLayoutPlugin.updateGridLayout();
    }
});

确保仅在数据从真/假切换时触发。如果您的数据最初是未定义的并且您在给它一个初始值之前浪费时间调用网格重绘,这将很重要。

【讨论】:

  • 这几乎可以工作... 一个问题似乎是重新应用与分配给 ng-grid 的 div 关联的 CSS。调整网格大小时,背景和边框不会改变。
  • 似乎没有具体应用哪些 CSS 类?包括你的 gridOptions 和 CSS 类定义可能有助于解决这个问题。
  • 我已经包含了我的 gridOptions 和上面的相关 CSS。感谢大家的帮助!
  • 我仍然无法理解您的剩余问题。我需要看到一个有效的 jsfiddle 或至少一些屏幕截图。网格是否正确调整大小,但包含的边框仍显示为旧大小?如果您描述如何不重新应用该样式,将会有所帮助。是否有任何 javascript 错误?
  • 他们升级到版本 3。插件可以在 2.x 分支中找到:github.com/angular-ui/ng-grid/blob/2.x/plugins/… 不确定插件是否适用于 v3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多