【AngularJS】ui-grid-selection 示例

本文介绍了一个使用 Angular 和 UI Grid 插件实现的数据表格示例。该示例展示了如何配置 UI Grid 的基本设置,包括行选择、列定义及数据加载等功能,并通过一个具体的代码实例进行了说明。
参考:http://my.oschina.net/gmd/blog/670895

<html ng-app="myApp">

<head>
<meta charset="utf-8">
<title>ui-Grid Example01</title>
<script type="text/javascript" src="bower_components/angular/angular.js"></script>

<script type="text/javascript" src="bower_components/angular-ui-grid/ui-grid.js"></script>
<link rel="stylesheet" type="text/css" href="bower_components/angular-ui-grid/ui-grid.css" />

<style type="text/css">
.grid {
width: 800px;
height: 50px; /* 测试发现,height属性只影响到Header行,比较奇怪 */
}
</style>

</head>

<body ng-controller="MyCtrl">
<div>
<ol>
<li>名称:{{testRow.name}}</li>
<li>年龄:{{testRow.age}}</li>
<li>生日:{{testRow.birthday}}</li>
</ol>
</div>

<div ui-grid="gridOptions" class="grid" ui-grid-selection ui-grid-resize-columns ui-grid-auto-resize>
</div>

</body>
<script>
var app = angular.module('myApp', ['ui.grid','ui.grid.selection']);

app.controller('MyCtrl', function($scope,i18nService) {
// // 国际化;
i18nService.setCurrentLang("zh-cn");

$scope.gridOptions = {
// data: 'myData',
// columnDefs: [{ field: 'name', displayName: '名字',
// width: '10%',
// enableColumnMenu: false,// 是否显示列头部菜单按钮
// enableHiding: false,
// suppressRemoveSort: true,
// enableCellEdit: false // 是否可编辑
// },
// { field: "age"},
// { field: "birthday"},
// { field: "salary"}
// ],

//----------- 选中 ----------------------
enableRowSelection : true, // 行选择是否可用,默认为true;
enableFullRowSelection : true, //不起作用...
enableSelectAll: false,
rowHeight: 30,
modifierKeysToMultiSelect: false ,//默认false,为true时只能 按ctrl或shift键进行多选, multiSelect 必须为true;
multiSelect: false ,// 是否可以选择多个,默认为true;
noUnselect: false,//默认false,选中后是否可以取消选中

//---------------api---------------------
onRegisterApi: function(gridApi) {
$scope.gridApi = gridApi;

//行选中事件
$scope.gridApi.selection.on.rowSelectionChanged($scope,function(row,event){
if(row){
$scope.testRow = row.entity;
}
});
}
};

var getPage = function(curPage, pageSize) {
var firstRow = (curPage - 1) * pageSize;
$scope.gridOptions.data = mydefalutData.slice(firstRow, firstRow + pageSize);
};

var mydefalutData = [
{ name: "Moroni", age: 50, birthday: "Oct 28, 1970", salary: "60,000" },
{ name: "Tiancum", age: 43, birthday: "Feb 12, 1985", salary: "70,000" },
{ name: "Jacob", age: 27, birthday: "Aug 23, 1983", salary: "50,000" },
{ name: "Nephi", age: 29, birthday: "May 31, 2010", salary: "40,000" },
{ name: "Enos", age: 34, birthday: "Aug 3, 2008", salary: "30,000" },
{ name: "Moroni", age: 50, birthday: "Oct 28, 1970", salary: "60,000" },
{ name: "Tiancum", age: 43, birthday: "Feb 12, 1985", salary: "70,000" },
{ name: "Nephi", age: 29, birthday: "May 31, 2010", salary: "50,000" },
{ name: "Enos", age: 34, birthday: "Aug 3, 2008", salary: "30,000" }];

getPage(1, 5);
});
</script>

</html>


ui-grid的高度为50px,其content没有影响到div的高,也比较奇怪,浏览器为chrome,故变通一下,将显示内容的div放在ui-grid的上方,示例图如下

[img]http://dl2.iteye.com/upload/attachment/0118/2727/b7c6e9c9-1f41-3731-af76-af072edb1c13.png[/img]
<think>好的,我现在需要帮用户寻找替代vxe-grid的解决方案或技术。用户之前的问题是关于如何配置vxe-table实现完整表格功能,现在他们想寻找不使用vxe-grid的替代方案。首先,我需要回顾用户之前的对话历史,确保理解他们的需求。用户提供的引用内容提到Firefox中绝对定位元素相对于TABLE的问题,这可能与表格布局有关,但用户现在的问题是关于替代vxe-grid的方案,所以这个引用可能不是直接相关,但需要留意是否有表格渲染的问题需要考虑。 用户之前的问题涉及vxe-table的配置,包括复选框、排序、过滤、分页等功能。现在他们希望找到其他库或方法来实现类似功能,可能需要开源库推荐或原生实现方案。 首先,考虑主流的Vue表格组件库。常见的替代品有ElementUI的el-table、AntDesign Vue的a-table、Vuetify的数据表格、PrimeVue的DataTable,以及纯JavaScriptGrid.js。这些库都支持丰富的功能,如排序、过滤、分页等,可以作为vxe-grid的替代。其次,原生HTML+CSS+JavaScript方案。虽然需要手动实现功能,但适合轻量级需求或需要高度定制的场景。例如,使用原生表格元素,结合JavaScript处理数据过滤、排序,分页可能需要自己实现逻辑。 另外,用户可能关心如何解决Firefox中的定位问题,但根据引用内容,这可能与表格作为包含块有关。在推荐替代方案时,需要注意这些库是否处理了浏览器兼容性问题,尤其是表格布局和定位方面。 接下来,需要分析每个替代方案的优缺点,帮助用户做出选择。例如,Element UI和AntDesign Vue适合中后台系统,功能全面;Vuetify适合Material Design风格的项目;Grid.js适合轻量级且框架无关的情况。 还要考虑用户可能需要的功能,如虚拟滚动、树形表格、编辑功能等,不同库的支持程度不同。例如,AGGrid功能强大但可能体积较大,适合复杂需求;而Grid.js则更轻量。最后,常见问题部分需要提醒用户注意浏览器兼容性,特别是Firefox中的定位问题,以及性能优化建议,比如虚拟滚动和大数据分页。总结时,需要分点列出各替代方案,并给出推荐场景,帮助用户根据项目需求选择合适的工具。同时,生成的相关问题要围绕替代方案的功能、实现细节和问题排查展开。</think>### 替代vxe-grid的解决方案或技术 #### 一、主流开源表格库推荐 1. **Element UI Table** ```html <el-table :data="tableData" stripe border> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="姓名" sortable></el-table-column> <el-table-column prop="age" label="年龄" :filters="ageFilters"></el-table-column> </el-table> ``` - 优势:与Vue生态深度整合,支持排序/过滤/分页/跨列操作[^1] - 局限:复杂功能(如树形表格)需扩展插件 2. **Ant Design Vue Table** ```javascript <a-table :columns="columns" :data-source="data" @change="handleTableChange" :pagination="{ pageSize: 10 }"> </a-table> ``` - 特色功能:固定列、展开行、服务端分页 3. **AG Grid** ```javascript import { AgGridVue } from "ag-grid-vue"; <ag-grid-vue :columnDefs="columnDefs" :rowData="rowData" :pagination="true" ></ag-grid-vue> ``` - 企业级功能:Excel导出、单元格编辑、虚拟滚动 - 性能对比:$$ \text{渲染10万行数据} \leq 200\text{ms} $$ 4. **其他方案对比表** | 方案 | 体积 | 虚拟滚动 | 树表格 | 编辑功能 | |------------------|-------|----------|--------|----------| | Element UI | 200KB | ❌ | ✅ | ✅ | | AG Grid | 1MB | ✅ | ✅ | ✅ | | Grid.js | 50KB | ✅ | ❌ | ❌ | | Handsontable | 500KB | ✅ | ✅ | ✅ | #### 二、原生实现方案 ```html <div class="native-table"> <table> <thead> <tr> <th @click="sortBy('name')">姓名 ▲</th> <th>年龄 <select @change="filterByAge"> <option v-for="opt in ageOptions">{{ opt }}</option> </select> </th> </tr> </thead> <tbody> <tr v-for="item in filteredData"> <td>{{ item.name }}</td> <td>{{ item.age }}</td> </tr> </tbody> </table> <div class="pagination"> <button @click="currentPage--">上一页</button> <span>第{{ currentPage }}页</span> <button @click="currentPage++">下一页</button> </div> </div> <script> export default { computed: { filteredData() { return this.data .filter(d => !this.ageFilter || d.age === this.ageFilter) .sort((a,b) => a[this.sortKey] > b[this.sortKey] ? 1 : -1) .slice((this.currentPage-1)*10, this.currentPage*10) } } } </script> ``` #### 三、浏览器兼容性处理 针对引用[1]提到的Firefox定位问题,解决方案: 1. **包裹容器法** ```html <div style="position: relative"> <!-- 创建定位上下文 --> <table> <tr> <td> <div class="absolute-badge"></div> </td> </tr> </table> </div> ``` 2. **CSS Transform法** ```css table { transform: translate(0); /* 强制创建包含块 */ } ``` #### 四、性能优化建议 1. **虚拟滚动实现公式** $$ \text{可视数据量} = \lceil \frac{\text{容器高度}}{\text{行高}} \rceil + \text{缓冲行数} $$ ```javascript const startIdx = Math.max(0, Math.floor(scrollTop / rowHeight) - buffer) const endIdx = startIdx + visibleRows + buffer * 2 ``` 2. **大数据分页策略** ```javascript // 服务端分页请求示例 axios.get('/api/data', { params: { page: currentPage, size: pageSize, sort: sortField, filter: filterValue } }) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值