简体   繁体   English

SAP UI5 - 如何根据行状态禁用 sap.m.Table Multiselect 表中的行

[英]SAP UI5 - How to disable a row in sap.m.Table Multiselect table based on row status

I have a bit a tricky problem.我有一个棘手的问题。 I want to disable the row selection is sap.m.Table .我想禁用行选择是sap.m.Table But the Table is available in Panel Content但是表格在Panel内容中可用

<VBox items="{dataModel>/Products}">
   <Panel expandable="true" id="testPanel" expanded="false" width="auto" class="sapUiResponsiveMargin">
      <headerToolbar>
         <Toolbar style="Clear">
            <Text text="{dataModel>productText}"></Text>
         </Toolbar>
      </headerToolbar>
      <content>
         <Table id="productsTable" items="{dataModel>productsList}" id="skillsTable" visible="true" sticky="ColumnHeaders"
            mode="MultiSelect">
            <columns>
               <Column>
                  <Text text="Product Name"/>
               </Column>
               <Column>
                  <Text text="Product No"/>
               </Column>
               <Column>
                  <Text text="Asset"/>
               </Column>
               <Column>
                  <Text text="Check Duplicate"/>
               </Column>
            </columns>
            <items>
               <ColumnListItem >
                  <cells>
                     <Text text="{dataModel>productName}"/>
                     <Text text="{dataModel>productNo}"/>
                     <Text text="{dataModel>asset}"/>
                     <Text text="{dataModel>checkDuplicate}"/>
                  </cells>
               </ColumnListItem>
            </items>
         </Table>
      </content>
   </Panel>
</VBox> 

If you see the above Code, There are 3 points... 1)VBox has an array of Products 2)Inside VBox there is Panel 3)Inside Panel, in Panel Content, I have given sap.m.Table , It means like there might be multiple tables will get generated based on the data coming from backend.如果你看到上面的代码,有 3 点...... 1)VBox 有一个产品数组 2)VBox 内部有面板 3)面板内部,在面板内容中,我已经给出了sap.m.Table ,这意味着像可能会根据来自后端的数据生成多个表。

Now my requirement is like how can I disable a row based on the boolean value in checkDuplicate ?现在我的要求是如何根据checkDuplicate的布尔值禁用一行?

Below is my controller logic, what I'm trying...以下是我的控制器逻辑,我正在尝试...

var tbl = self.getView().byId('productsTable');
var header = tbl.$().find('thead');
var selectAllCb = header.find('.sapMCb');
selectAllCb.remove();

tbl.getItems().forEach(function (r) {
    var obj = r.getBindingContext("dataModel").getObject();
    var oStatus = obj.checkDuplicate;
    var cb = r.$().find('.sapMCb');
    var oCb = sap.ui.getCore().byId(cb.attr('id'));
    if (oStatus == "true") {
        oCb.setEnabled(true);
    } else {
        oCb.setEnabled(false);
    }
});

The problem with the above logic is, if there is only one Table, then based on the Table id , I can get the row data and I can disable the row.上述逻辑的问题是,如果只有一个 Table,那么根据 Table id ,我可以获取行数据,并且可以禁用该行。 But here multiple Tables will get generated dynamically, So I can't give ID for the Table.但是这里会动态生成多个表,所以我不能给出表的 ID。

Can someone please help me how can I disable the row based on checkDuplicate boolean Value?有人可以帮助我如何禁用基于checkDuplicate布尔值的行吗?

Thank you in advance先感谢您

Add an event listener for the event modelContextChange to your table.将事件modelContextChange的事件侦听器添加到您的表中。

Fired when models or contexts are changed on this object (either by calling setModel/setBindingContext or due to propagation)在此对象上更改模型或上下文时触发(通过调用 setModel/setBindingContext 或由于传播)

<Table id="productsTable" 
       modelContextChange=".onModelContextChange"
       items="{dataModel>productsList}"
       sticky="ColumnHeaders"
       mode="MultiSelect"
>
...
</Table>

The event contains the parameter "id" of the current table.该事件包含当前表的参数“id”。 This way, you can retrieve the current table by its complete id and re-use your code with a minor change.这样,您可以通过其完整的 id 检索当前表,并在稍作更改后重新使用您的代码。

onModelContextChange: function(oEvent) {
    var sId = oEvent.getParameter("id");
    var tbl = sap.ui.getCore().byId(sId);
    var header = tbl.$().find('thead');
    var selectAllCb = header.find('.sapMCb');
    selectAllCb.remove();

    tbl.getItems().forEach(function (r) {
        var obj = r.getBindingContext("dataModel").getObject();
        var oStatus = obj.checkDuplicate; 
        var cb = r.$().find('.sapMCb');
        var oCb = sap.ui.getCore().byId(cb.attr('id'));
        if (oStatus == "true") {
            oCb.setEnabled(true);
        } else {
            oCb.setEnabled(false);
        }
    });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM