项目为Angular12使用antDesgin框架 一、nz-select参数不回显。需求是表格配置形式,可进行增删改,所以会遇到遍历数组生成下拉框。下拉框选项不可重复选择,所以我在做的时候每次都过滤掉已经选择过的选项,配置时一切都没有问题,到保存下数据再弹出需要回显数据时出现问题了,下拉框的选项值不回显,百度了各种可能的原因1、this.cdr.detectChanges();强制更新,2、trackBy: trackByCode设置唯一标识,3、确保选项值和保存数据类型一致各种原因排查,最后终于发现!是因为每次都把已经选择的过滤掉了,导致选项列表已经不存在当前选的值了,在配置时不会有问题,但是回显时候就出bug了!!以后一定要注意下拉框选项不可用的值用disabled!!
二、nz-table分页器监听nzPageIndexChange变更刷新数据会把pageIndex变为1。简单的表格配合后端进行分页操作,但是每次监听pageIndex变更后获取新数据都会再来一次pageIndexChange,找了很久问题所在发现是获取新数据后设置total会再次触发nzPageIndexChange并把pageIndex值设置为1。最终用深拷贝给pagination重新赋值就不会出现这个问题。
三、angular的form表单校验不标红问题,排查发现元素已经标记为脏,并且已有class但是没有
标红也没有出现ant-form-item-explain提示文字元素,这是因为在form初始化时需要在NgOnInit里,实现场景因为是在弹框中需要回显数据,所以把初始化放在了NgOnChanges中,可以在init中初始化,onchange中在patchValue赋值。
四、angualr关于ExpressionChangedAfterItHasBeenCheckedError的报错,场景是在封装自定义form的报错error-tip组件时,用到了@ViewChild,默认static=false模板是静态存在的,设置 static: true 可在组件初始化阶段完成模板查询,避免ExpressionChangedAfterItHasBeenCheckedError的报错。
五、nz-tree绑定的nzCheckedKeys问题;1.初始化赋值默认值不回显问题,需要先渲染树数据,就是先获取到nzData的值,再设置nzCheckedKeys的值,就可以回显成功。2.手动删除树上已选择的节点不生效,比如nzCheckedKeys绑定的值是checkedKeys,设置checkedKeys.splice(index, 1)无法实现对应节点的取消选择,需要使用checkedKeys = checkedKeys.filter((_, i) => i !== index)重新设置一下checkedKeys的值就可以取消选择成功啦。 注意!如果树数据会手动变更,所绑定的nzCheckedKeys和nzExpandedKeys需要重新赋值一下,checkedKeys = [...checkedKeys]就可以。
由于这里的树数据量较大,nz-tree的实现原理是全部渲染,导致页面卡顿,这里可以用antdesign提供的nzVirtualHeight虚拟滚动,实现仅加载可视层节点,避免卡顿。
但是加了虚拟滚动之后,[nzSearchValue]="keyword"检索功能会失效,这是因为未渲染的节点无法定位过滤,所以需要手动写过滤检索功能,这里封装了recursiveFilterTree方法,定义原始树数据和过滤后的树数据。
// 递归过滤匹配关键字的树
function recursiveFilter(node, keyword): boolean {
const isMatch = node.title.toLowerCase().includes(keyword.toLowerCase());
if (node.children) {
node.children = node.children.filter(child =>
recursiveFilter(child, keyword)
);
return isMatch || node.children.length > 0;
}
return isMatch;
}
export function recursiveFilterTree(tree, keyword) {
const data = cloneDeep(tree);
return !!keyword ? data.filter(node => recursiveFilter(node, keyword)) : data;
}
这里需要注意的是,在赋值过滤后的树节点时,如果用浅拷贝的方式会导致原始树也被更改,所以要用深拷贝,但是使用深拷贝后,树重新渲染复选框选中情况也会清空,所以在使用时需要重新赋值下checkedKeys绑定的值,代码如下:
我这里是tab切换的两个树,所以需要赋值俩个,实际操作中传入树和检索词就可以获取检索后的树。