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
相关推荐
前端一课9 小时前
我还在上班,怎么做一个长期有价值的号
前端
前端一课10 小时前
用 TRAE Work 把项目踩坑经验沉淀成「团队可复用工程规范」,新人再也不重复掉坑
前端·后端
cyadyx10 小时前
【Three.js】Three.js 中加载 3D 模型
前端·javascript·3d
汉堡大王952710 小时前
前端工程师 TypeScript 上手指南:一条清晰的从入门到精通路线
前端·javascript·react.js
wear工程师10 小时前
防抖为什么会失效?React 面试里的闭包和定时器
javascript·react.js
浅水壁虎10 小时前
vue基础(第四章 Pinia)
前端·javascript·vue.js
用户21816970493010 小时前
Flutter (十四) SingleChildScrollView ListView
前端
昭阳10 小时前
4 个 vibe coding 项目,一个普通前端的半年
前端·人工智能·设计
颜进强10 小时前
Claude Code - 26 效率三件套:cc-switch 切模型 · codeburn 算成本 · claude-hud 看状态
前端·后端·ai编程
东方小月10 小时前
从零开发一个 Coding Agent(八):如何使用 Agent 类管理对话状态
前端·人工智能