ThingsBoard - APP首页修改为手工选择组织

问题描述

移动端的主页是通过一个仪表板移动视图实现的,打开后会显示一个默认组织的电量。管理员有多个组织的权限,用户要求先弹出选择框,一边手动选择一个组织。

问题分析

在移动视图仪表板中,使用了一个自定义的InitEntity部件,其作用是在仪表板加载时,若当前用户有一个或多个组织的权限,则设置任意一个组织为默认实体。

javascript 复制代码
self.onInit = function() {
    if (self.ctx.stateController.getStateParams().entityId == null && self.ctx.data.length) {
        var o = self.ctx.data[0];
        var params = { 
            entityId: {
                entityId: o.datasource.entity.id,
                entityName: o.datasource.entityName, 
                entityLabel: o.datasource.entityLabel
            },
            targetEntityParamName: "entityId"
        };
        //for (var i=0; i < o.dataKeys.length; i++) 先写个死的
        if (o.data && o.data.length > 0) {
            var tvPair = o.data[o.data.length - 1];
            params.entityId.entityProfile = tvPair[1];
        }
        self.ctx.stateController.updateState(self.ctx.stateController.getStateId(), params, false);
    }
}

问题解决

根据用户需求,InitEntity部件的逻辑应当修改为,当用户只有一个组织的权限时,将该组织指定为默认实体,当用户有多个组织的权限时,则弹出选择窗口,让用户先选择。代码修改如下

javascript 复制代码
self.onInit = function() {
    console.info("init", self.ctx.stateController.getStateParams(),self.ctx.stateController);
    window.initentity_ctx = self.ctx;
    if (self.ctx.stateController.getStateParams().entityId == null && self.ctx.data.length) {
        //增加本行及else段
        if (self.ctx.data.length == 1) {
            var o = self.ctx.data[0];
            var params = { 
                entityId: {
                    entityId: o.datasource.entity.id,
                    entityName: o.datasource.entityName, 
                    entityLabel: o.datasource.entityLabel
                },
                targetEntityParamName: "entityId"
            };
            //for (var i=0; i < o.dataKeys.length; i++) 先写个死的
            if (o.data && o.data.length > 0) {
                var tvPair = o.data[o.data.length - 1];
                params.entityId.entityProfile = tvPair[1];
            }
            self.ctx.stateController.updateState(self.ctx.stateController.getStateId(), params, false);
        } else {
            self.ctx.stateController.updateState("select", {}, false);
        }
    }
}

注意代码最后一句的写法

javascript 复制代码
self.ctx.stateController.updateState("select", {}, false); //正常
self.ctx.stateController.openState("select", {}, false); //点击详情时报错,提示entityProfile为null
相关推荐
AiMan19 分钟前
Grok生成的内容能否下载吗?
前端
徐小夕1 小时前
JitArchives,一款基于JitWord协同AI文档打造的企业级电子档案系统
前端·vue.js·github
陈随易1 小时前
Node.js 2026上半年都有哪些性能提升?
前端·后端·程序员
墨林陌1 小时前
AI 热点日报(2026-11-09):苹果代理式Siri曝光,Anthropic推进IPO,编码智能体实测翻车
前端
vipxieliang1 小时前
JavaScript 迭代器与生成器:控制异步与惰性求值
前端·javascript
Hilaku1 小时前
Event Loop 这篇你看完就不用再看别的了!
前端·javascript·程序员
恋猫de小郭2 小时前
Flutter 下 AOT 一个你怎么都想不出来的 Bug ,JIT 正常的计算,在 AOT 居然算错了
android·前端·flutter
晓得迷路了2 小时前
栗子前端技术周刊第 153 期 - Vitest 5.1、Remix v3.2、Node.js 27 Alpha...
前端·javascript·vite
系统集成-鹰翔3 小时前
ERP单据已作废为什么商品仍不能删除,引用检查与软删除怎么查
javascript·经验分享·后端