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

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

我有一个棘手的问题。我要禁用的行选择是 sap.m.Table。但是 Table 在 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> 

如果你看到上面的代码,有3点... 1)VBox有一系列的产品 2)VBox里面有Panel 3)在面板内部,在面板内容中,我给出了sap.m.Table,这意味着可能会根据来自后端的数据生成多个表格。

现在我的要求是如何根据 checkDuplicate 中的布尔值禁用一行?

下面是我的控制器逻辑,我正在尝试...

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);
    }
});

上面逻辑的问题是,如果只有一个Table,那么根据Tableid,我可以得到行数据,我可以禁用排。但是这里会动态生成多个 Table,所以我无法为 Table.

提供 ID

有人可以帮助我如何根据 checkDuplicate 布尔值禁用该行?

提前致谢

将事件 modelContextChange 的事件侦听器添加到您的 table。

Fired when models or contexts are changed on this object (either by calling setModel/setBindingContext or due to propagation)

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

事件包含当前table的参数"id"。这样,您可以通过其完整 ID 检索当前的 table,并通过较小的更改重新使用您的代码。

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);
        }
    });
}