如何在SAPUI5中设置Controller中的List排序器?

时间:2014-11-24 11:58:17

标签: xml sapui5

这基本上是针对此问题的解决方法:“How to use custom sorter in XML views

由于目前无法在XML视图中使用自定义分拣机,我想也许可以在控制器中设置分拣机。

如何使用JS视图执行此操作:

var oTemplate = ... // irrelevant

var oList = new sap.m.List({
    id: this.createId("someList"),
    items: {
        path: "/list",
        template: oTemplate,
        sorter: foo.bar.CustomSorter
    }
});

当我想将其转换为XML视图时,我有以下内容:

<m:List id="someList"
        items="{path: '/list'}">
    <!-- hid ListItem implementation -->
</m:List>

然后,如何在控制器中为此列表设置分拣机? 还有,在哪里挂钩呢?选项:

  • onInit
  • onBeforeRendering
  • onAfterRendering

所以,我的期望是:

sap.ui.controller("foo.bar.controller.SomeController", {
   onInit : function(){
      var oList = this.getView().byId("someList");
      oList.get___Something___().setSorter(foo.bar.CustomSorter);
   };
};

但似乎不可能。

4 个答案:

答案 0 :(得分:5)

您可以使用列表绑定的分拣机属性:

<List
      id="invoiceList"
      class="sapUiResponsiveMargin"
      width="auto"
      items="{
         path : '/Invoices',
         sorter : {
            path : 'ProductName' 
         }
      }" >

https://sapui5.hana.ondemand.com/#docs/guide/c4b2a32bb72f483faa173e890e48d812.html

我也尝试用onInit设置分拣机,不幸的是this.getView()。byId(“whateverID”)此时失败...

答案 1 :(得分:2)

对于JSView中的聚合绑定,您必须为Control提供模型和模板。

假设我们使用的是sap.ui.model.json.JSONModel:

var oModel = new sap.ui.model.json.JSONModel();
var oData = {
    users: [
        {
            id: '15',
            name: 'Peter'
        },
        {
            id: '16',
            name: 'Angela'
        }
    ]
};
oModel.setData(oData);

现在我们获得了带有指定数据的JSONModel,我们可以继续为aggregationBinding创建一个模板:

var oItemTemplate = new sap.m.StandardListItem();
oItemTemplate.bindProperty('title', {path: 'name'});

现在我们得到了一个模板列表条目,我们将使用它来创建列表条目。目前我们会松散&#34;绑定完成后任何用户的id信息。因此,让我们将用户ID绑定为CustomData:

var oCustomData = new sap.ui.core.CustomData({
    key: 'id'
});
oCustomData.bindProperty('value', {path: 'id'});
oItemTemplate.addCustomData(oCustomDataId); // adds the custom data to the template

稍后我们可以从相应的ListItem中检索此CustomData作为键/值对。

现在我们仍然想要为绑定配置添加自定义Sorter。在我们的例子中,我们创建了一个新的Sorter,它按照&#34; name&#34;来对项目进行排序。属性:

var oSorter = new sap.ui.model.Sorter('name');
var oBindingInfo = {
    path: '/users',
    template: oItemTemplate,
    sorter: oSorter
};

在最后一步中,我们必须将项目绑定到我们的控件。在这种情况下,我们使用sap.m.List控件:

var oList = new sap.m.List();
oList.setModel(oModel);

oList.bindItems(oBindingInfo);

请记住,这只是一个简单的用例。我忽略了用于实例化控件的所有其他配置参数,因此可能还有一些工作要做。该示例仅涵盖纯文本数据绑定和排序。

有关详细信息,请参阅:

https://sapui5.hana.ondemand.com/docs/api/symbols/sap.ui.base.ManagedObject.html#bindAggregation

https://sapui5.hana.ondemand.com/#docs/guide/4ce11a576ef44bb680c81b36a0462e86.html

答案 2 :(得分:1)

你可以这样做:

onInit: function() {
  var SORTKEY = "someSortKey";
  var DESCENDING = true;
  var GROUP = false;
  var oList = this.getView().byId("someList");
  var oBinding = oList.getBinding("items");
  var aSorter = [];
  // you may use foo.bar.CustomSorter instead:
  aSorter.push(new sap.ui.model.Sorter(SORTKEY, DESCENDING, GROUP));
  oBinding.sort(aSorter);
}

答案 3 :(得分:0)

onInit应该没问题。

使用List的方法bindItems绑定项目并应用分拣机。

类似的东西:

oList.bindItems('/ list',ListItemTemplate,foo.bar.CustomSorter);

此致 基莫