【问题标题】:How to drag and drop rows of a table如何拖放表格的行
【发布时间】:2020-01-28 11:26:51
【问题描述】:

在我的 view.xml 文件中:

<html:div class="container-fluid">   
    <html:div class="row">
              <Table id="ConnectorModuleTable"
                       items="{
                            path: '/datalist'}">
                        <columns>
                            <Column ><Text text="Connector Module"/></Column>
                            <Column ><Text text="Setting A"/></Column>
                            <Column ><Text text="Setting B"/></Column>
                            <Column ><Text text="Custom Pin"/></Column>
                            <Column ><Text text="Actions"/></Column>
                        </columns>

                    <items>
                        <ColumnListItem>
                            <cells>
                                <Text text="{Connectormodule}" wrapping="false" />
                                <Text text="{settingA}" wrapping="false" />
                                <Text text="{settingB}" wrapping="false" />
                                <Text text="{settingB}" wrapping="false" />
                            </cells>
                        </ColumnListItem>
                    </items>
                </Table>
   </html:div>
    </html:div>

我正在尝试拖放此表的行

我已将显示列表的文档中的链接称为: Documentation example link here

我对控制器中的表应用的相同:

attachDragAndDrop: function () {
    var oList = this.byId("MyTable");

    oList.addDragDropConfig(new DragInfo({
        sourceAggregation: "items"
    }));
    oList.addDragDropConfig(new DropInfo({
        targetAggregation: "items",
        dropPosition: "Between",
        dropLayout: "Vertical",
        drop: this.onDrop.bind(this)
    }));

},

onDrop: function (oInfo) {

    var oDragged = oInfo.getParameter("draggedControl"),
        oDropped = oInfo.getParameter("droppedControl"),
        sInsertPosition = oInfo.getParameter("dropPosition"),

        oDraggedParent = oDragged.getParent(),
        oDroppedParent = oDropped.getParent(),

        oDragModel = oDraggedParent.getModel(),
        oDropModel = oDroppedParent.getModel(),
        oDragModelData = oDragModel.getData(),
        oDropModelData = oDropModel.getData(),

        iDragPosition = oDraggedParent.indexOfItem(oDragged),
        iDropPosition = oDroppedParent.indexOfItem(oDropped);

    // remove the item
    var oItem = oDragModelData[iDragPosition];
    oDragModelData.splice(iDragPosition, 1);

    if (oDragModel === oDropModel && iDragPosition < iDropPosition) {
        iDropPosition--;
    }

    // insert the control in target aggregation
    if (sInsertPosition === "Before") {
        oDropModelData.splice(iDropPosition, 0, oItem);
    } else {
        oDropModelData.splice(iDropPosition + 1, 0, oItem);
    }

    if (oDragModel !== oDropModel) {
        oDragModel.setData(oDragModelData);
        oDropModel.setData(oDropModelData);
    } else {
        oDropModel.setData(oDropModelData);
    }
},

initData: function (datalist) {
    this.byId("MyTable").setModel(new JSONModel([
        datalist

    ]));

}

这里datalist 包含 JSON 格式的所有行数据(供参考)

但这不起作用,感谢任何帮助或指导链接

【问题讨论】:

    标签: sapui5


    【解决方案1】:

    我在您的 onDrop() 中使用了以下视图,它起作用了。 你能描述一下,什么不工作吗?

    <Table id="MyTable" items="{/}">
        <columns>
            <Column ><Text text="Connector Module"/></Column>
            <Column ><Text text="Setting A"/></Column>
            <Column ><Text text="Setting B"/></Column>
        </columns>
        <dragDropConfig>
            <dnd:DragDropInfo
                    sourceAggregation="items"
                    targetAggregation="items"
                    dropPosition="Between"
                    drop=".onDrop"/>
        </dragDropConfig>
        <items>
            <ColumnListItem>
                <cells>
                    <Text text="{Connectormodule}" wrapping="false" />
                    <Text text="{settingA}" wrapping="false" />
                    <Text text="{settingB}" wrapping="false" />
                    <Text text="{settingB}" wrapping="false" />
                </cells>
            </ColumnListItem>
        </items>
    </Table>
    

    【讨论】:

    • 我正在获取未定义的数据:- oDragModelData = (3) [undefined, undefined, undefined], oDragModel = constructor {pSequentialImportCompleted: Promise, mEventRegistry: {…}, mMessages: null, id: "id-1580302908064-25", oData: Array(3), ...},... oDropModelData = (3) [undefined, undefined, undefined], oDropModel = constructor {pSequentialImportCompleted: Promise, mEventRegistry: {...}, mMessages: null, id: "id-1580302908064-25", oData: Array(3), ...}
    【解决方案2】:

    你能看到原始表格中的数据吗? 模型设置不正确:JSONModel 构造函数需要一个对象,而不是 initData 函数中列出的数组。这对我来说似乎是一个绑定问题......

    我只是尝试如下修改您的代码,一切正常:

        onDrop: function (oInfo) {
            var oDragged = oInfo.getParameter("draggedControl"),
                oDropped = oInfo.getParameter("droppedControl"),
                sInsertPosition = oInfo.getParameter("dropPosition"),
    
                oDraggedParent = oDragged.getParent(),
                oDroppedParent = oDropped.getParent(),
    
                oDragModel = oDraggedParent.getModel(),
                oDropModel = oDroppedParent.getModel(),
                oDragModelData = oDragModel.getData(),
                oDropModelData = oDropModel.getData(),
    
                iDragPosition = oDraggedParent.indexOfItem(oDragged),
                iDropPosition = oDroppedParent.indexOfItem(oDropped);
    
            // remove the item
            var oItem = oDragModelData.datalist[iDragPosition];
            oDragModelData.datalist.splice(iDragPosition, 1);
    
            if (oDragModel === oDropModel && iDragPosition < iDropPosition) {
                iDropPosition--;
            }
    
            // insert the control in target aggregation
            if (sInsertPosition === "Before") {
                oDropModelData.datalist.splice(iDropPosition, 0, oItem);
            } else {
                oDropModelData.datalist.splice(iDropPosition + 1, 0, oItem);
            }
    
            if (oDragModel !== oDropModel) {
                oDragModel.setData(oDragModelData);
                oDropModel.setData(oDropModelData);
            } else {
                oDropModel.setData(oDropModelData);
            }
        },
    
        initData: function (datalist) {
            //just an example
            var oData = {
                datalist: [{
                    Connectormodule: "one",
                    settingA: "one",
                    settingB: "one"
                }, {
                    Connectormodule: "two",
                    settingA: "two",
                    settingB: "two"
                }, {
                    Connectormodule: "three",
                    settingA: "three",
                    settingB: "three"
                }]
            };
    
            var oModel = new sap.ui.model.json.JSONModel(oData);
            this.byId("ConnectorModuleTable").setModel(oModel);
        },
    

    【讨论】:

    • 我正在获取数据列表为:- 0:{connectormodule:“Guide”,settingA:“1”,settingB:“2”,自定义:“”} 1:{connectormodule:“Module”, settingA:“1”,settingB:“2 Left”,自定义:“”},我收到 var oItem = oDragModelData.datalist[iDragPosition] 的错误; as 无法读取未定义的属性“0”
    • 你用的是什么版本的Ui5?您的模型是命名还是未命名?
    • 我指的是 SAP UI5 文档 (openui5nightly.hana.ondemand.com/controls)
    • 我认为最好参考稳定版本的文档(你可以在这里找到它ui5.sap.com)但我的问题是不同的......如果你按 ctrl+shift+alt+P您正在运行的 UI5 应用程序列出的 SAPUI5 版本是什么?
    • 我使用的是 SAPUI5 版本:-1.73.2
    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 2017-01-10
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多