UI5删除重复的Feed列表项

时间:2017-12-05 01:28:58

标签: javascript xml sapui5

我有一个Feed列表,用于在我的UI5 xml视图中发布评论

<layout:content>
    <m:FeedInput post="onFeedPost" class="sapUiSmallMarginTopBottom"/>
    <m:List id="feedList" showSeparators="Inner" items="{path: '/table', sorter: {path: 'DATE', descending: true}}">
        <m:FeedListItem sender="{MEMBERID}" timestamp="{DATE}" text="{COMMENT}" convertLinksToAnchorTags="All"/>
    </m:List>
</layout:content>

我希望不显示具有相同文本和日期的重复注释,但要将它们保留在数据库中。我的想法是在控制器中遍历项目来执行此操作,但我不确定如何处理结果数组

var results = [];
var comments = feed.getItems();

for (var n = 0; n < comments.length - 1; n++) {
    var contained = false; 

    for (var m = n + 1; m < comments.length; m++) {
        if (comments[n].getText() === comments[m].getText() && 
            comments[n].getDate() === comments[m].getDate()) {
            comments.pop(m);

            contained = true;

            if (!results.includes(comments[n])) {
                results.push(comments[n]);
            }
        }
    }

    if (!contained && !results.includes(comments[n])) {
        results.push(comments[n]);
    }
}

// replace list items with results array

我无法弄清楚如何使用新数组替换Feed列表项,因为有getItems函数但不是setItems函数。它发生在我身上可能有一个更简单的更惯用的UI5方法,但我还没有找到它。

2 个答案:

答案 0 :(得分:1)

首先,处理这种情况的正确方法是在OData服务中。在将数据发送到客户端之前,服务应删除重复项。但是,如果我们假设你不能做这个服务器端,那么你有一些选择。

1。)不要将列表项绑定到任何内容。相反,使用ODataModel读取数据,然后过滤掉重复项,创建一个新的列表项并将其添加到列表中

使用ODataModel读取数据,然后将结果传递给将过滤并将其添加到列表中的方法

oModel.read("/EntitySet", {
    success: function(oResponse) {
        this._addCommentsToList(oResponse.results)
    }.bind(this)
})

在处理结果的方法中,您需要做三件事 - 创建一个新的FeedListItem,设置列表项的绑定上下文,然后将列表项添加到列表中

var aDistinctComments = //use your logic to filter out duplicates
aDistinctComments.forEach(function(oComment) {
    //to set the binding context, you'll need the entity key/path
    var sCommentKey = oModel.createKey("/EntitySet", oComment)
    //create a new binding context
    var oContext = oModel.createBindingContext(sCommentKey)
    //create a new FeedListItem
    var oItem = new FeedListItem({
        sender: "{MemberId}",
        ...
    });
    //set the context of the item and add it to the list
    oItem.setBindingContext(oContext);
    oList.addItem(oItem);
})

2.。)将列表直接绑定到OData实体集,然后当列表接收数据时,遍历项目并隐藏重复项

<List items="{/EntitySet}" updateFinished="onListUpdateFinished"....>

----- onListUpdateFinished ---
var aItems = oList.getItems();
for (var m = n + 1; m < aItems.length; m++) {
    //set a boolean, true if duplicate
    var bDuplicate = aItems[m].getText() ==== aItems[n].getText() &&
                     aItems[m].getDate() === aItems[n].getDate();
    //set the visibility of the item to true if it is not a duplicate
    aItems[m].setVisible(!bDuplicate)
}

3.。)手动读取数据,删除重复项,并将其存储在JSON模型中,并将表绑定到JSON模型路径

oModel.read("/EntitySet", {
    success: function(oResponse) {
        this._addCommentsToJSONModel(oResponse.results)
    }.bind(this)
})

您可以在JSON模型中存储对象数组,然后将表项绑定到该路径

 var aDistinctComments = // your logic to get distinct comments
 oJSONModel.setProperty("/comments", aDistinctComments)
 oList.setModel(oJSONModel);

 -----

 <List items="{/comments"}....>

4.。)将列表项绑定到实体集,迭代项,然后从列表中删除重复项。我不推荐这种方法。从绑定到实体集的列表中手动删除项可能会导致重复ID出现问题。

 var oItem = //use your logic to find a duplicate list item
 oList.removeItem(oItem)

我建议首先在OData服务中处理此服务器端,如果这不是一个选项,则使用上面的选项1。这将为您提供所需的结果并维护列表项的绑定上下文。选项2和3将为您提供所需的结果,但根据您的应用,可能会使列表更难处理。

答案 1 :(得分:-1)

这是一种方法:

不要直接将列表绑定到oData。 您可以创建一个JSON模型,该模型将在删除重复项后成为模型。

将JSON模型绑定到List:

var oList = this.getView().byId("feedList"); oList.bindAggregation("items", "pathToJsonArray", template);

(在这种情况下,模板是feedlistitem)。