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
相关推荐
理人综艺好会13 分钟前
Web学习之用户认证
前端·学习
●VON20 分钟前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von
We་ct30 分钟前
LeetCode 36. 有效的数独:Set实现哈希表最优解
前端·算法·leetcode·typescript·散列表
爱吃大芒果37 分钟前
Flutter for OpenHarmony 实战:mango_shop 路由系统的配置与页面跳转逻辑
开发语言·javascript·flutter
qq_1777673741 分钟前
React Native鸿蒙跨平台实现消息列表用于存储所有消息数据,筛选状态用于控制消息筛选结果
javascript·react native·react.js·ecmascript·harmonyos
weixin_3954489142 分钟前
main.c_cursor_0129
前端·网络·算法
Acrelhuang1 小时前
工商业用电成本高?安科瑞液冷储能一体机一站式解供能难题-安科瑞黄安南
大数据·开发语言·人工智能·物联网·安全
沐雪架构师1 小时前
LangChain 1.0 Agent开发实战指南
开发语言·javascript·langchain
2501_940007891 小时前
Flutter for OpenHarmony三国杀攻略App实战 - 战绩记录功能实现
开发语言·javascript·flutter
摘星编程1 小时前
React Native + OpenHarmony:自定义useEllipsis省略号处理
javascript·react native·react.js