基于Stencil组件的SharePoint新闻文本搜索过滤器部分用户报错问题
- 业务背景:在SharePoint站点部署了自研新闻过滤组件,支持用户输入匹配新闻标题、描述内容的关键词完成新闻检索
- 异常表现:仅2名特定用户通过文本输入触发搜索时会抛出运行错误,该组件功能对其余所有用户均可正常运行
- 参考资料:配套对应报错截图用于问题定位,组件实现代码如下
组件核心代码实现
组件业务逻辑(Stencil框架)
import { Component, Host, h, Prop, Event, EventEmitter, Element, } from "@stencil/core"; import { uniqueCategorias } from "./../../utils/utils"; export interface SearchData { dtInicio?: string; dtFim?: string; categoria?: string; texto?: string; isFilter?: boolean; } @Component({ tag: "snt-noticias-cards-filtro", styleUrl: "noticias-cards-filtro.scss", shadow: true, }) export class SntNoticiasCardsFiltro { @Element() private element: HTMLElement // 获取分类下拉框DOM实例 get ddlCategoria(): any { return this.element.shadowRoot.querySelector("#ddlCategoria") as any; } // 获取分类下拉框全量选项 get allddlCategoria(): NodeListOf<HTMLElement> { return this.element.shadowRoot.querySelectorAll( "ul > snt-option" ) as NodeListOf<HTMLElement>; } // 获取开始日期选择器实例 get dtInicio(): any { return this.element.shadowRoot.querySelector("#dtInicio") as any; } // 获取结束日期选择器实例 get dtFim(): any { return this.element.shadowRoot.querySelector("#dtfim") as any; } // 获取搜索文本输入框实例 get txtPesquisar(): HTMLInputElement { return this.element.shadowRoot.querySelector( "#txtPesquisar" ) as HTMLInputElement; } // 向外抛出搜索事件 @Event({ eventName: "search", bubbles: false }) search: EventEmitter<SearchData>; // 组件公共属性 @Prop() disable: boolean = true; @Prop() categorias: any[]; @Prop() itenSelect: string; categoriasFilter: any[] = []; // 组件加载完成后初始化去重分类列表 async componentDidLoad() { this.categoriasFilter = uniqueCategorias(this.categorias); } // 汇总筛选条件并触发搜索事件 async searchHandler(event?: CustomEvent) { this.search.emit({ categoria: this.itenSelect, texto: this.txtPesquisar.value, dtInicio: await this.dtInicio.getDate(), dtFim: await this.dtFim.getDate(), }); event && event.stopPropagation(); } // 分类下拉值变更回调 changeDllCategoria({ detail }) { this.itenSelect = detail; } // 清空所有筛选条件并重新触发搜索 clear() { this.txtPesquisar.value = null; this.dtInicio.clearDate(); this.dtFim.clearDate(); this.itenSelect = ""; this.ddlCategoria.setValue(""); this.searchHandler(); } }
组件渲染模板
render() { this.categoriasFilter = uniqueCategorias(this.categorias); return ( <Host> <section class="news-filter"> <div class="news-filter-inner"> <div class="news-filter-content"> <div class="news-filter-content-data"> <snt-dropdown id="ddlCategoria" class="dropdown1" placeholder="Categoria" onValueChange={this.changeDllCategoria.bind(this)} isClearable={true} > <snt-option value="">Todas as Categorias</snt-option> {this.categoriasFilter.map((item: any) => { return ( <snt-option value={item.Label} selected={item.Label === this.itenSelect} > {item.Label} </snt-option> ); })} </snt-dropdown> <spfx-datepicker id="dtInicio" datepicker-id="single-date-picker" place-holder="Data Inicio" ></spfx-datepicker> <spfx-datepicker id="dtfim" datepicker-id="single-date-picker" place-holder="Data Fim" ></spfx-datepicker> <snt-input-text id="txtPesquisar" tipo="text" placeholder="Pesquise uma Notícia" ></snt-input-text> </div> <div class="news-filter-button"> <snt-button text="APLICAR" type="apply" onBtnClick={this.searchHandler.bind(this)} ></snt-button> <snt-button text="LIMPAR" type="clean" onBtnClick={this.clear.bind(this)} ></snt-button> </div> </div> </div> </section> </Host> ); }
内容的提问来源于stack exchange,提问作者Miguel Tomé
相关产品推荐
相关产品推荐

