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
相关推荐
whyfail17 小时前
前端数据存储新选择:IndexedDB与Dexie.js技术指南
前端·javascript·数据库
椰果uu17 小时前
vue-virtual-scroller-虚拟滚动列表:渲染不定高度长列表+可控跳转
前端·javascript·typescript·vue
三佛科技-1341638421217 小时前
PL3327CE/PL3327CD/CS/CF原边调节恒流/恒压控制离线反激式开关电源芯片 典型应用电路
单片机·嵌入式硬件·物联网·智能家居
Kagol17 小时前
深入浅出 TinyEditor 富文本编辑器系列之一:TinyEditor 是什么
前端·typescript·开源
空城雀17 小时前
python精通连续剧第一集:简单计算器
服务器·前端·python
超绝大帅哥17 小时前
为什么回调函数不是一种好的异步编程方式
javascript
不务正业的前端学徒17 小时前
手写简单的call bind apply
前端
jump_jump17 小时前
Ripple:一个现代的响应式 UI 框架
前端·javascript·前端框架
用户9047066835717 小时前
Nuxt css 如何写?
前端