SAPUI5:通过setVisibility隐藏<list> </list>

时间:2014-05-01 15:34:42

标签: listview visibility sapui5

我有一个sap.m.List的xml视图,其中包含一些sap.m.InputListItems

<List id="listJobParams">  

  <headerToolbar> ... </headerToolbar>

  <InputListItem label="Partition" id="listItemPartition" visible="false">
    <Select id="partition" selectedKey="{/partition}" />
  </InputListItem>

  ...
</List>

基于某些条件,我想使用setVisibility(true|false)方法隐藏整个List或仅隐藏某些InputListItems。 根据条件隐藏/显示输入列表项可以正常工作,但隐藏/显示整个列表不起作用。

问题:一旦通过this.byId("listJobParams").setVisibility(false)隐藏了列表,就无法使用this.byId("listJobParams").setVisibility(true)再次显示列表; js控制台中没有错误,但列表也没有出现。所以我想知道为什么InputListItem的行为与List不同。

控制器代码(从onInit()方法中调用):

_refreshJobDetailInput : function (channelId, eventId, data) {

  // hiding/showing input list item
  this.byId("listItemPartition").setVisible(data.jobType=='singlePartitionIndexingJob');

  // hiding/showing the entire list DOES NOT WORK; once hidden, it will never appear again, even though the condition is true (and logs as true in the console)
  this.byId("listJobParams").setVisible(data.jobType=='singlePartitionIndexingJob');

}

该方法可用并记录在sap.m.list的父类(https://openui5.hana.ondemand.com/docs/api/symbols/sap.m.ListBase.html#setVisible

更新

根据Qualiture的答案,我尝试了以下无效和/或重新渲染的组合,但到目前为止它没有帮助。

// 2 parents up is the 'panel'      
this.byId("listJobParams").getParent().getParent().invalidate(); 
this.byId("listJobParams").getParent().getParent().rerender();

// 3 parents up is the 'page'
this.byId("listJobParams").getParent().getParent().getParent().invalidate(); 
this.byId("listJobParams").getParent().getParent().getParent().rerender();

// 4 parents up is the 'xmlview'
this.byId("listJobParams").getParent().getParent().getParent().getParent().invalidate(); 
this.byId("listJobParams").getParent().getParent().getParent().getParent().rerender();

// this return the shell
this.byId("listJobParams").getParent().getParent().getParent().getParent().getParent().getParent().getParent().invalidate();
this.byId("listJobParams").getParent().getParent().getParent().getParent().getParent().getParent().getParent().rerender();

3 个答案:

答案 0 :(得分:1)

  1. this.byId("listItemPartition").setVisible...将无效,因为DOM中不存在具有listItemPartition ID的对象。它只是克隆的模板。列表项从此模板复制,但获取自己生成的ID。此外,列表项是通过绑定动态创建的,因此直接操作它们有一点意义:列表的下一个无效可以使用新ID重建列表项。

  2. 确保不要使用不可见的列表项作为列表的模板。

  3. 切勿直接使用rerender()。使用invalidate()invalidate()在内部调用rerender()

答案 1 :(得分:0)

类似的问题(sap.ui.commons.Panel内的sap.ui.ux3.Shell)已在SCN(http://scn.sap.com/thread/3546783)发布了

也许触发一个无效事件到你的父容器就足够了?

答案 2 :(得分:0)

另一种解决方法是挂钩onAfterRendering事件&amp;使用jQuery .css("display", "none")来隐藏或显示DOM元素。 SAPUI5&#34; visible : true&#34;意味着&#34;在DOM&#34;和&#34; visible : false&#34;表示删除了DOM元素,或者根本没有创建它。