工厂函数是一种从模型数据创建控件的更强大的方法。为控件聚合的每个条目调用工厂函数,开发人员可以决定每个条目是否应由具有不同属性的相同控件表示,甚至每个条目由完全不同的控件表示。工厂函数采用参数sId(应用作新控件的ID)和oContext(用于访问条目的模型数据)。返回的对象必须是sap.ui.core.Element类型。下面介绍如何在XML视图和控制器中使用来自列表绑定(聚合绑定)的JSON模型数据来实现此场景:factoryfunction.createContent在controller中实现:sap.ui.define(["sap/ui/core/mvc/Controller","sap/ui/model/json/JSOMOdel","sap/ui/model/type/String","sap/ui/model/type/Float","sap/m/Input","sap/m/Text","sap/m/CheckBox"],function(Controller,JSONModel,StringType,Float,Input,Text,CheckBox){"usestrict";returnController.extend("sap.ui.sample.App",{onInit:function(){...},createContent:function(sId,oContext){varoRevenue=oContext.getProperty("收入");switch(typeofoRevenue){case"string":returnnewText(sId,{text:{path:"revenue",type:newStringType()}});case"number":returnnewInput(sId,{value:{path:"revenue",type:newFloat()}});case"boolean":returnnewCheckBox(sId,{checked:{path:"revenue"}});}},});});在控制器中工厂函数的实现中,根根据收入数据类型动态创建SAPUI5控件在App控制器中,我们创建了一个名为productListFactory的新函数。工厂函数返回与绑定上下文关联的控件,类似于我们在上一步中定义的XML模板。此工厂函数返回的控件类型必须适用于sap.m.List对象的项目聚合。在这种情况下,我们根据存储在正在创建的项目的上下文中的数据返回StandardListItem或ObjectListItem。我们通过检查当前库存水平和产品是否已停产来确定退回哪种类型的控制。对于这两个选项,我们准备并加载一个XML片段,以便我们可以声明性地定义视图逻辑并分配当前控制器。如果库存水平为零并且产品也已停产,那么我们使用ProductSimpleXML片段,否则使用ProductExtendedXML片段。XML片段在每种情况下只需要加载一次,因此我们通过在控制器上存储一个辅助变量并仅加载一次来创建一个Singleton。对于列表中的每个项目,我们克隆存储在控制器上的相应控件。此方法创建一个新的控件副本,我们可以将其绑定到列表项的上下文。请注意:在工厂函数中,我们负责创建控件的生命周期。如果产品没有停产但库存水平为零,我们暂时缺货。在本例中,我们添加了一个ObjectAttribute,它使用JavaScript将OutofStock消息添加到控件中。类似于XML视图或片段中的声明性定义,我们可以使用数据绑定语法来绑定属性。在这种情况下,我们将文本绑定到资源包中的一个属性。由于Attribute是列表项的子项,因此它可以访问所有分配的模型和当前绑定上下文。最后,我们返回列表中显示的控件。