angular使用ui-select小结

初识:

首先看看ui-select的结构:

<ui-select ng-model="demoChoose" theme="bootstrap" ng-change="changeDemoChooseList()">
            <ui-select-match>
                <span>{{$item}}</span>
            </ui-select-match>
            <ui-select-choices repeat="c in demoList">
                <div ng-bind-html="c | highlight: $select.search"></div>
            </ui-select-choices>
        </ui-select>

然后看一下样式:
在这里插入图片描述

	//js里面的简单赋值
	$scope.demoList=['123','456','789','101112']
    $scope.demoChoose=[]

那我们可以很明显的知道:
1.ui-select-match 代表选中以及输入区域
1){{$item}} 这里显示选中使用的是repeat ui-select中ng-modal的值,所以这里直接使用item就可以显示,如果ng-modal的值为对象,这里对应修改即可。
2.ui-select-choices 代表可选区域
1)这里的下拉可选列表也是一个简单的repeat,不多说。
2)ng-bind-html 这里是绑定用户所选择的项,以高亮状态展示

简单的单选:

在上面代码的基础上,我们加上一个ng-change事件和一个搜索功能代码如下:

<ui-select ng-model="demoChoose.value" theme="bootstrap" ng-change="changeDemoChooseList()">
            <ui-select-match>
                <span>{{demoChoose.value.name}}</span>
            </ui-select-match>
            <ui-select-choices repeat="c in (demoList | propsFilter: {id:$select.search, name: $select.search})">
                <div ng-bind-html="c.name | highlight: $select.search"></div>
            </ui-select-choices>
        </ui-select>

js代码也做相应的修改:

$scope.demoList=[{
        id:'123',
        name: '张三',
    },{
        id:'456',
        name: '李四',
    },{
        id:'789',
        name: '王五',
    },{
        id:'1011',
        name: '赵六',
    }]
    //这里这样定义,是因为官方文档里面 提到的这里绑定的不能是一个简单的对象
$scope.demoChoose={
        value: {
        }
    }
    $scope.changeDemoChooseList= function(){
        console.log($scope.demoList);
        console.log($scope.demoChoose);
    }

filter代码如下:

app.filter('propsFilter', function () {
    return function (items, props) {
        var out = [];
        if (angular.isArray(items)) {
            items.forEach(function (item) {
                var itemMatches = false;
                var keys = Object.keys(props);
                for (var i = 0; i < keys.length; i++) {
                    var prop = keys[i];
                    var text = props[prop].toLowerCase();
                    if (item[prop].toString().toLowerCase().indexOf(text) !== -1) {
                        itemMatches = true;
                        break;
                    }
                }
                if (itemMatches) {
                    out.push(item);
                }
            });
        } else {
            out = items;
        }
        return out;
    };
})

然后看一下对应的效果:
在这里插入图片描述
在这里插入图片描述

简单的多选:

只需要在ui-select里面加上multiple就支持多选了

<ui-select ng-model="demoChoose.value" multiple theme="bootstrap" ng-change="changeDemoChooseList()">
            <ui-select-match>
                <span>{{$item.name}}</span>
            </ui-select-match>
            <ui-select-choices repeat="c in (demoList | propsFilter: {id:$select.search, name: $select.search})">
                <div ng-bind-html="c.name | highlight: $select.search"></div>
            </ui-select-choices>
        </ui-select>

js代码如下:

$scope.demoList=[{
        id:'123',
        name: '张三',
    },{
        id:'456',
        name: '李四',
    },{
        id:'789',
        name: '王五',
    },{
        id:'1011',
        name: '赵六',
    }]

 $scope.demoChoose={
        value:[]
    }
    
    $scope.changeDemoChooseList= function(){
        console.log($scope.demoList);
        console.log($scope.demoChoose);
    }

最后看一下效果:
在这里插入图片描述在这里插入图片描述

复杂的多选:

在ng-repeat中使用ui-select,且下拉选项所有ui-select公用。
举个例子:selectA选中了张三,selectB选中了李四,那么selectA与selectB的下拉列表应该都只有王五,赵六两条数据。

这里要说明一下:只有在可选列表中的项,才能够在已选中显示。

<div class="panel-body timeBox" ng-repeat="item in demoChoose">
        <ui-select ng-model="item.value" multiple theme="bootstrap" ng-change="changeDemoChooseList()">
            <ui-select-match>
                <span>{{$item.name}}</span>
            </ui-select-match>
            <ui-select-choices repeat="c in (item.demoList | propsFilter: {id:$select.search, name: $select.search})">
                <div ng-bind-html="c.name | highlight: $select.search"></div>
            </ui-select-choices>
        </ui-select>
    </div>

js代码如下:

$scope.demoList=[{
        id:'123',
        name: '张三',
    },{
        id:'456',
        name: '李四',
    },{
        id:'789',
        name: '王五',
    },{
        id:'1011',
        name: '赵六',
    }]
    $scope.demoChoose=[{
        value:[],
        demoList: [],
    },{
        value:[],
        demoList: [],
    }]

    $scope.changeDemoChooseList= function(){
        //获取所有选中项
        let choosed = [];
        angular.forEach($scope.demoChoose, function(item){
            angular.forEach(item.value, function(vitem){
                choosed[vitem.id] = true;
            })
        })
        //修改每一个select的下拉
        //这里有一个有趣的问题大家可以去尝试一下:
        /*choosed只取除自己以外的选中,下面的判断就不需要再把自己选中的加进来,但是这样写会出现一个问题,
        就是选中列表里面是有数据的,但是却不显示,是因为这里有一个active的概念,我们的下拉列表的数据来自于
        一个总的数据源,但是这个数据源是没有记录active的,而我们的选中列表和可选列表是有记录active状态的,
        所以这里选择的做法是:先去除所有选中的得到公用的下拉列表,然后再将自己的选中加到下拉列表中,
        这样就ok了。*/
        angular.forEach($scope.demoChoose, function (item) {
            let nowChoosed = item.value;
            item.demoList = $scope.demoList.filter(function(ditem){
                return !choosed[ditem.id];
            })
            item.demoList = [...nowChoosed, ...item.demoList]
        })
    }

然后看一下效果:
在这里插入图片描述
在这里插入图片描述

最后希望大家都可以能够很舒服的使用这个ui-select,如果我这里有什么问题,希望大家指出来,一起进步,一起成长。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
要在 Angular使用 ng-zorro-antd 的 nz-table 组件合并表格,可以使用 nzSpanMethod 属性来指定合并规则。具体步骤如下: 1. 在组件中定义表格数据源 dataSource 和表格列定义 columns。 2. 在表格列定义中,对需要合并的列设置 nzSpanMethod 属性,该属性值为一个回调函数,用于计算该列每个单元格的合并行数和列数。 3. 在回调函数中,可以通过参数 row 和 column 获取当前单元格所在的行和列,然后根据业务需求计算出该单元格需要合并的行数和列数。 示例代码如下: ``` <ng-container *ngFor="let col of columns"> <th *ngIf="!col.children" [nzWidth]="col.width || ''" [nzLeft]="col.left || ''" [nzRight]="col.right || ''" [nzAlign]="col.align || 'center'" [nzVerticalAlign]="col.verticalAlign || 'middle'" [nzSpanMethod]="col.spanMethod"> {{ col.title }} </th> <th *ngIf="col.children" [nzColSpan]="col.colSpan" [nzRowSpan]="col.rowSpan"> {{ col.title }} </th> </ng-container> ``` 其中,columns 数组中的每个元素表示一个表格列定义,具体属性如下: - title:列标题。 - width:列宽度。 - left:左侧距离。 - right:右侧距离。 - align:水平对齐方式。 - verticalAlign:垂直对齐方式。 - children:子列定义,用于实现表头多级嵌套。 - colSpan:列合并数。 - rowSpan:行合并数。 - spanMethod:合并规则回调函数。 合并规则回调函数的参数如下: - row:当前单元格所在的行。 - column:当前单元格所在的列。 回调函数需要返回一个对象,包含以下属性: - rowspan:合并的行数。 - colspan:合并的列数。 示例代码如下: ``` spanMethod(row: any, column: any): { rowspan: number, colspan: number } { if (column.key === 'name') { if (row.id === 1) { return { rowspan: 2, colspan: 1 }; } else if (row.id === 3) { return { rowspan: 2, colspan: 1 }; } } return { rowspan: 1, colspan: 1 }; } ``` 以上代码实现了对 name 列的合并,当该列的值为 'John' 或 'Lucy' 时,将该单元格合并到下一行;当该列的值为 'Tom' 或 'Jerry' 时,将该单元格合并到上一行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值