多个菜单打开同一视图时,视图类对象的单例/多例和状态问题

按照文档:同一个视图可以在菜单中定义多个入口,用id区分
image

这是三个菜单组,通过urlQueryParameters区分对相同视图的引用

<menu id="Facility.Check" title="设备巡检">
        <item id="Facility.BusinessCategory" view="BusinessCategory.list" title="巡检业务分类">
            <urlQueryParameters>
                <parameter name="type" value="FACILITY"/>
            </urlQueryParameters>
        </item>
        <item id="Facility.Item" view="CheckItem.list" title="巡检内容">
            <urlQueryParameters>
                <parameter name="type" value="FACILITY"/>
            </urlQueryParameters>
        </item>
        <item id="Facility.Group" view="CheckGroup.list" title="巡检点分组">
            <urlQueryParameters>
                <parameter name="type" value="FACILITY"/>
            </urlQueryParameters>
        </item>
        <item id="Facility.Point" view="CheckPoint.list" title="巡检点">
            <urlQueryParameters>
                <parameter name="type" value="FACILITY"/>
            </urlQueryParameters>
        </item>
    </menu>

    <menu id="SafeTask.Check" title="安全巡查">
        <item id="SafeTask.BusinessCategory" view="BusinessCategory.list" title="巡查业务分类">
            <urlQueryParameters>
                <parameter name="type" value="SAFE_TASK"/>
            </urlQueryParameters>
        </item>
        <item id="SafeTask.Item" view="CheckItem.list" title="巡查内容">
            <urlQueryParameters>
                <parameter name="type" value="SAFE_TASK"/>
            </urlQueryParameters>
        </item>
        <item id="SafeTask.Group" view="CheckGroup.list" title="巡查点分组">
            <urlQueryParameters>
                <parameter name="type" value="SAFE_TASK"/>
            </urlQueryParameters>
        </item>
        <item id="SafeTask.Point" view="CheckPoint.list" title="巡查点">
            <urlQueryParameters>
                <parameter name="type" value="SAFE_TASK"/>
            </urlQueryParameters>
        </item>
    </menu>

    <menu id="Risk.Check" title="隐患排查">
        <item id="Risk.BusinessCategory" view="BusinessCategory.list" title="排查业务分类">
            <urlQueryParameters>
                <parameter name="type" value="RISK"/>
            </urlQueryParameters>
        </item>
        <item id="Risk.Item" view="CheckItem.list" title="排查内容">
            <urlQueryParameters>
                <parameter name="type" value="RISK"/>
            </urlQueryParameters>
        </item>
        <item id="Risk.Group" view="CheckGroup.list" title="排查点分组">
            <urlQueryParameters>
                <parameter name="type" value="RISK"/>
            </urlQueryParameters>
        </item>
        <item id="Risk.Point" view="CheckPoint.list" title="排查点">
            <urlQueryParameters>
                <parameter name="type" value="RISK"/>
            </urlQueryParameters>
        </item>
    </menu>

当在这些相同视图(不同菜单入口)间进行切换时,Jmix使用同一个视图实例,onInit事件也只会执行一次,该实例保留了相关的状态,例如选中项。

第一次进入【设备巡检->巡检点分组】菜单,选中一条记录
image

第二次进入【安全巡查->巡查点分组】菜单
image

datagrid中保留了第一次进入时的选中项,但不在第二个界面的删选范围内(通过urlQueryParameters进行删选了),列表中没有选中项,但【编辑】按钮是点亮的。

从后台可以看出,两次进入是同一个GroupListView实例。
image

此时必须这样才能消除选中状态:
image

如果这两次中间点击了其他菜单项,也就是显示过其他视图,那么第二次就是一个新的实例
image

总结问题:
点击菜单显示视图界面,应该每次都创建新的视图实例,而不是认为仅仅是urlQueryParameters发生了变化,而使用相同实例并保留实例状态。

1 个赞