thingsboard 通過Entities hierarchy部件實現左邊菜單點擊,右邊的表格按左邊的分類型進行過濾篩選數據源

在 ThingsBoard 中,要讓“Entities hierarchy”部件(左側樹形導航)與右側的數據表格實現聯動——即點擊左側某個節點后,右側表格立刻按該節點對應的實體類型/層級進行過濾——需要把“數據源別名(Alias)+ 儀表板狀態(State)+ 部件動作(Action)”三件事串起來做。下面給出可直接落地的完整步驟(PE/CE 通用)。


一、準備數據模型

  1. 給所有需要被分類的實體(設備/資產)打上統一的屬性關系
    例如:

    • 屬性 region: “華北”、“華南”

    • 關系 Contains:Asset → Device

  2. 在“資產”里建一個樹形結構,如
    根 Asset → 區域 Asset → 子區域 Asset → 設備 Device。


二、做左側“Entities hierarchy”部件

  1. 進入儀表板編輯模式 → 添加部件 → Cards → Entities hierarchy

  2. 數據源選“實體列表”或“資產查詢”別名(見下一步),讓它把整個資產樹一次性展開。

  3. 在部件設置 → Actions(動作) → 添加動作

    • 觸發源:On node selected

    • 動作類型:Update current dashboard state

    • 狀態參數:

      entityId: ${entityId}
      entityType: ${entityType}
      entityName: ${entityName}

    保存。


三、做右側“Entity table”部件

  1. 添加部件 → Cards → Entities table

  2. 關鍵在數據源別名

    • 打開“Entity aliases” → 新建別名

    • 類型選 Relations query(關系查詢)

    • 起點:Dashboard state entity(即左側點擊的節點)

    • 方向:From

    • 關系類型:Contains

    • 最大層級:按需要(一般 1 層即可)

    • 目標實體過濾:可再按類型(Device/Asset)或屬性過濾
      保存別名后回到表格部件,數據源選擇剛創建的別名。

  3. 表格列配置完后保存。


四、測試

  1. 退出編輯,刷新儀表板。

  2. 在左側樹形列表點任意節點 → 右側表格立即只顯示該節點“包含”的設備或子資產。

  3. 若要多級聯動(點區域 → 子區域 → 設備),把層級設成 2 或 3 即可。

ngOnInit(): void {this.ctx.$scope.entitiesTableWidget = this;this.settings = this.ctx.settings;this.widgetConfig = this.ctx.widgetConfig;this.subscription = this.ctx.defaultSubscription;this.initializeConfig();this.updateDatasources();this.ctx.updateWidgetParams();if (this.displayPagination) {this.widgetResize$ = new ResizeObserver(() => {this.ngZone.run(() => {const showHidePageSize = this.elementRef.nativeElement.offsetWidth < hidePageSizePixelValue;if (showHidePageSize !== this.hidePageSize) {this.hidePageSize = showHidePageSize;this.cd.markForCheck();}});});this.widgetResize$.observe(this.elementRef.nativeElement);}function decodeState(raw: string | null): any {if (!raw) return null;try {// 1?? URL 解碼const urlDecoded = decodeURIComponent(raw);// 2?? BASE64 解碼 → Latin-1 字符串const latin1 = atob(urlDecoded);// 3?? Latin-1 → UTF-8const utf8 = new TextDecoder('utf-8').decode(Uint8Array.from(latin1, c => c.charCodeAt(0)));// 4?? JSON 解析return JSON.parse(utf8);} catch (e) {console.error('state 解碼失敗', e);return null;}}var collectParamObj=null;// 監聽路由參數變化(不刷新頁面)this.route.queryParams.pipe(takeUntil(this.destroy$)).subscribe(params => {const state = decodeState(params['state']);//console.log('監聽路由state=', JSON.stringify(state));if (!state) return ;if (state.length > 0 && state[0]?.params) {//const stateId = state[0].id;collectParamObj = state?.[0]?.params?.collect_param;if (collectParamObj) {// 把整個 collect_param 對象傳進去this.handleUrlParamsChange(collectParamObj);}}});}private handleUrlParamsChange(collectParam:any) {// 根據參數重新加載數據或更新過濾條件// 示例:更新 pageLink 的過濾條件//this.pageLink.textSearch = params.entityId || null;//console.log('filter entityId=', params);if (collectParam){const entityId = collectParam?.entityId?.id;const entityType = collectParam?.entityId?.entityType;const entityName = collectParam?.entityName;const entityLabel = collectParam?.entityLabel;const param={entityType,entityId,entityName,entityLabel};// 延后一幀再執行setTimeout(() => this.updateData(param));}}private buildKeyFiltersFromQueryParams(params: Params): KeyFilter[] {const filters: KeyFilter[] = [];if (!params) {return filters;   // 返回空數組而不是 null,避免下游遍歷出錯}const entityType = params['entityType'];const entityId = params['entityId'];const entityName = params['entityName'];const entityLabel = params['entityLabel'];if (entityType =="ENTITY_VIEW"){if (entityLabel) {filters.push({key: {type: EntityKeyType.ENTITY_FIELD,key: 'label'},valueType: EntityKeyValueType.STRING,predicate: {type: FilterPredicateType.STRING,operation: StringOperation.EQUAL,value: {defaultValue: entityLabel,dynamicValue: null},ignoreCase: false // ? 添加這一行}});}}else if (entityType =="DEVICE"){if (entityName) {filters.push({key: {type: EntityKeyType.ENTITY_FIELD,key: 'name'},valueType: EntityKeyValueType.STRING,predicate: {type: FilterPredicateType.STRING,operation: StringOperation.EQUAL,value: {defaultValue: entityName,dynamicValue: null},ignoreCase: false // ? 添加這一行}});}}//console.log("filters",filters);return filters;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93869.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93869.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93869.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Ansible】核心概念解析:架構、清單管理與配置入門

本專欄文章持續更新&#xff0c;新增內容使用藍色表示。對于系統管理員而言&#xff0c;手動管理每一臺服務器不僅維護難度極大&#xff0c;而且即使經驗豐富&#xff0c;也難免出現疏忽和錯誤。自動化技術能有效避免因手動管理系統和基礎架構而產生的各類問題。其優點包括&…

rs-fMRI_兩篇文章中分析方法的梳理(近乎翻譯)

文章一文章信息APOE ε4 influences within and between network functional connectivity in posterior cortical atrophy and logopenic progressive aphasia2024美國梅奧診所發表在Alzheimers Dement. 的文章。“APOE ε4等位基因對后皮質萎縮與進行性語言障礙型失語癥的網絡…

在互聯網大廠的Java面試:謝飛機的搞笑歷險記

在互聯網大廠的Java面試&#xff1a;謝飛機的搞笑歷險記 在一個陽光明媚的早上&#xff0c;我們的主角&#xff0c;程序員謝飛機&#xff0c;走進了一家著名的互聯網大廠&#xff0c;準備迎接他人生中最嚴峻的挑戰——Java面試。 第一輪&#xff1a;基礎技術面試 面試官&#x…

微軟AD國產化替換倒計時——不是選擇題,而是生存題

一直以來&#xff0c;微軟Active Directory&#xff08;AD&#xff09;作為企業身份管理和訪問控制的核心組件&#xff0c;承擔著用戶認證、權限分配、資源目錄管理等基礎職能。然而&#xff0c;隨著政策、合規與網絡安全壓力不斷加劇&#xff0c;AD面臨著前所未有的挑戰&#…

MyBatis-Plus MetaObjectHandler的幾個坑(主要是id字段)

1.背景 主要是要實現一個id字段的自增長&#xff0c;不依賴數據庫的能力&#xff08;已避免后續換庫的問題&#xff09;。姑且使用redis作為表的id分配器&#xff0c;因此使用MyBatis-Plus MetaObjectHandler對每個insert的id進行分配。 2.實施過程 以下是實現過程 1.實現MetaO…

Springboot 項目配置多數據源

Springboot 項目配置多數據源 基礎環境 java8、springboot2.2.13、mybatis、mysql5.x、oracle 項目配置 1.application.yml spring:datasource:mysql1:username: abcpassword: 123456url: jdbc:mysql://127.0.0.1:3306/panda?useUnicodetrue&characterEncodingUTF-8&z…

STM32_0001 KEILMDK V5.36 編譯一個STM32F103C8T6說core_cm3.h文件找不到以及編譯器版本不匹配的解決辦法

KEILMDK V5.36 編譯一個STM32F103C8T6說core_cm3.h文件找不到的解決辦法利用KEILMDK V5.36 編譯一個STM32F103C8T6說core_cm3.h文件找不到。主要錯誤信息如下D:/stm32studio/Armmdk/Packs/Keil/STM32F1xx_DFP/2.4.1/Device/Include\stm32f10x.h(486): error: core_cm3.h file n…

基于Transformer的機器翻譯——訓練篇

前言 還在為機器翻譯模型從理論到落地卡殼&#xff1f;系列博客第三彈——模型訓練篇強勢登場&#xff0c;手把手帶你走完Transformer中日翻譯項目的最后關鍵一步&#xff01; 前兩期我們搞定了數據預處理&#xff08;分詞、詞表構建全流程&#xff09;和模型搭建&#xff08…

智能編程中的智能體與 AI 應用:概念、架構與實踐場景

一、智能體&#xff08;Intelligent Agent&#xff09;在編程中的定義與架構1. 智能體的核心概念 智能體是指在特定環境中能夠自主感知、決策并執行動作的軟件實體&#xff0c;具備以下特征&#xff1a;自主性&#xff1a;無需人工干預即可根據環境變化調整行為。交互性&#x…

數組實現各類數據結構

目錄 一、數組實現單鏈表 二、數組實現雙鏈表 三、數組實現棧 四、數組模擬隊列 五、數組模擬單調棧 六、數組模擬單調隊列&#xff08;滑動窗口&#xff09; 七、數組模擬堆 一、數組實現單鏈表 #include<iostream> #include<algorithm> #include<cstr…

數據處理與統計分析 —— apply自定義函數

目錄 一、向量化與偽向量化 1、向量化 2、np.vectorize 偽向量化&#xff08;特定場景&#xff09; 3、apply&#xff08;自定義函數&#xff09; 二、apply函數 1、對series中使用apply 2、對dataframe中使用apply 3、apply函數案例-泰坦尼克號數據集] 數據集下載鏈接&#xf…

如何有效利用大語言模型來智能加速產業聯盟的產業鏈轉化路徑?

觀點作者&#xff1a;科易網AI技術轉移研究院在科技創新浪潮席卷全球的今天&#xff0c;科技成果轉化已成為衡量一個國家創新能力的重要標志。然而&#xff0c;一項權威調查顯示&#xff0c;我國科技成果轉化率不足30%&#xff0c;大量有價值的創新成果仍停留在實驗室階段&…

視頻加水印 視頻加水印軟件 視頻加動態水印

如果你有一個視頻&#xff0c;你想給他加一個水印&#xff0c;那么你可以使用這個工具&#xff0c;準備好你的視頻和水印。水印一般采用PNG&#xff0c;打開這個工具&#xff0c;把你的視頻和水印拖進這個方框當中。視頻限制是MP4&#xff0c;水印限制是PNG&#xff0c;它可以把…

面向DeepSeek chat coding實錄(二)

向DeepSeek的提問 幫我設計以下兩個python class Span 屬性&#xff1a; hash值&#xff08;在init函數中通過時間初始化&#xff09; 創建時間&#xff1a;時間&#xff08;在init函數中通過時間初始化&#xff09; 結束時間&#xff1a;時間&#xff08;可選&#xff0c;默認…

Hi3516CV610-00S 海思SOC芯片 可申請開發資料

1.1 概述Hi3516CV610 是一顆應用在安防市場的 IPC SoC。在開放操作系統、新一代視頻編解碼標準、網絡安全和隱私保護、人工智能方面引領行業發展&#xff0c;主要面向室內外場景下的槍機、球機、半球機、海螺機、槍球一體機、雙目長短焦機等產品形態&#xff0c;打造極具競爭力…

算法題Day4

目錄 13. 練習13 : 整數十位 14. 練習14 : 時間轉換 15. 練習15 : 小雨的游泳時間 13. 練習13 : 整數十位 解題方法: #include <iostream> using namespace std; int a; int main() {cin >> a;cout << a % 100 / 10 << endl;return 0; } 14. 練習…

加速你的故障排查:使用 Elasticsearch 構建家電手冊的 RAG 應用

作者&#xff1a;來自 Elastic Alessandro Brofferio 學習如何使用 Elasticsearch 構建 RAG 應用&#xff0c;輕松排查你的家電問題。 想要獲得 Elastic 認證嗎&#xff1f;來看看下一次 Elasticsearch 工程師培訓什么時候開始吧&#xff01; Elasticsearch 擁有大量新功能&am…

6.Shell腳本修煉手冊---grep命令使用指南

grep 命令&#xff1a;從文本中精準篩選信息的實用指南 文章目錄grep 命令&#xff1a;從文本中精準篩選信息的實用指南一、什么是 grep&#xff1f;為什么要用它&#xff1f;二、grep 基本語法三、常用選項詳解&#xff08;附實例&#xff09;&#xff08;一&#xff09;模式選…

Python day51

浙大疏錦行 Python day51 復習日&#xff0c;DDPM class DenoiseDiffusion():def __init__(self, eps_model: nn.Module, n_steps: int, device: torch.device):super().__init__()self.eps_model eps_modelself.n_steps n_stepsself.device deviceself.beta torch.linsp…

數據結構:生成 (Generating) 一棵 AVL 樹

目錄 搭建“創世”的舞臺 注入序列&#xff0c;觀察演化 注入 10 注入 20 注入 30 注入 40 注入 50 注入 25 再次審視 上一講&#xff0c;我們已經從最根本的邏輯出發&#xff0c;推導出了 AVL 樹失衡時所必需的修復操作——旋轉 (Rotation)。 現在&#xff0c;我們將…