如何在SAPUI5格式化器中使用外部数组或全局变量?
在SAPUI5格式化器中访问外部数组/传递参数的解决方案
问题场景
在UI5 Table中,多数列用常规格式化器处理,但某一列需要基于外部对比数组做复杂转换。该对比数组已从数据库获取并声明为控制器的全局变量,但遇到以下问题:
- 格式化器函数内的
this指向内部函数而非控制器实例,直接引用this.array返回undefined - 尝试通过
bindProperty的parts参数传递数组时触发绑定错误,因为parts的path仅支持字符串类型的绑定路径
尝试过的错误代码
var that = this; bindProperty( "text", { parts: [{ path: 'AA' }, { path: 'A'}, { path: that._C}], { path: that.array}, formatter: that.columnFormatter )
可行解决方案
方案1:将数组存入命名模型,通过绑定路径访问
把对比数组存入控制器的命名模型中,通过绑定路径传递给格式化器,这是UI5推荐的方式:
- 在控制器初始化时创建命名模型并赋值数组:
onInit: function() { // 假设this.array是已获取的对比数组 var oCompareModel = new sap.ui.model.json.JSONModel({ compareArray: this.array }); this.getView().setModel(oCompareModel, "compareModel"); // 设置命名模型 }
- 在绑定列时,通过
parts引用命名模型的路径:
var that = this; this.byId("yourColumn").bindProperty("text", { parts: [ { path: 'AA' }, // 表格行数据的属性 { path: 'A' }, { path: '/compareArray', model: 'compareModel' } // 引用命名模型中的数组 ], formatter: that.columnFormatter });
- 格式化器中直接接收数组参数:
columnFormatter: function(aaValue, aValue, compareArray) { // 在这里使用compareArray做复杂转换逻辑 return "处理后的值"; }
方案2:绑定格式化器的上下文(this指向控制器)
通过bind()方法将格式化器的this绑定到控制器实例,这样就能直接访问控制器的全局变量:
var that = this; this.byId("yourColumn").bindProperty("text", { parts: [{ path: 'AA' }, { path: 'A' }], formatter: that.columnFormatter.bind(that) // 绑定this到控制器实例 });
格式化器内直接访问控制器的全局数组:
columnFormatter: function(aaValue, aValue) { var compareArray = this.array; // 此时this指向控制器,可直接访问全局变量 // 执行复杂转换逻辑 return "处理后的值"; }
方案3:利用闭包捕获外部数组变量
如果对比数组是静态或初始化后不再变更的,可通过闭包让格式化器直接捕获数组:
var that = this; // 定义带闭包的格式化器 var customFormatter = function(aaValue, aValue) { var compareArray = that.array; // 直接捕获外部的控制器数组变量 // 执行复杂转换逻辑 return "处理后的值"; }; // 绑定列时使用该格式化器 this.byId("yourColumn").bindProperty("text", { parts: [{ path: 'AA' }, { path: 'A' }], formatter: customFormatter });
内容的提问来源于stack exchange,提问作者Anand Muthu
相关产品推荐
相关产品推荐

