You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Stencil组件的SharePoint新闻文本搜索过滤器部分用户报错问题

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>
              &nbsp;
              <snt-button
                text="LIMPAR"
                type="clean"
                onBtnClick={this.clear.bind(this)}
              ></snt-button>
            </div>
          </div>
        </div>
      </section>
    </Host>
  );
}

内容的提问来源于stack exchange,提问作者Miguel Tomé

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 14:06:04