在SAPUI5的JSView中,将当前控件引用传递给formatter函数非常容易:
oTable.bindItems("/rows", new sap.m.ColumnListItem({
cells : [ new sap.m.Text().bindProperty("text", {
parts: [
{ path: "someInteger" }
],
formatter: function(iValue) {
var idText = this.getId(); //this references the current control
return iValue;
}
})]
}));
(' easy'部分当然是因为在控件的内部格式化程序函数中引用了this
)
然而,对于XMLViews,我还没有设法在格式化函数中获得对当前控件的引用:
<Table items="{/rows}">
<columns>
<Column>
<Text text="Some Integer" />
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<Text text="{ path : 'someInteger', formatter : '.formatCell' }" />
</cells>
</ColumnListItem>
</items>
</Table>
格式化程序:
formatCell : function (sValue) {
var a = this; //this references the controller
return sValue;
}
任何人都知道如何在XMLViews中完成这项工作?
答案 0 :(得分:3)
在单独的文件中定义格式化程序函数。然后this
将成为正在格式化其属性的控件。
我/自己/ Formatter.js:
sap.ui.define(function () {
"use strict";
return {
formatCell: function (iValue) {
var idText = this.getId(); //this references the current control
return iValue;
}
};
});
查看:
<Table items="{/rows}">
<columns>
<Column>
<Text text="Some Integer" />
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<Text text="{ path : 'someInteger', formatter : 'my.own.Formatter.formatCell' }" />
</cells>
</ColumnListItem>
</items>
</Table>
答案 1 :(得分:1)
在此issue中,@ codeworrior的答案更加清楚:
在视图的控制器中搜索以点开头的名称(例如“ .foo”),并且执行上下文将强制为该控制器。
所有其他名称都从window对象开始解析,并且它们获得控件/元素作为保存绑定的上下文。
只需补充@hirse的答案,对于那些遇到formatter function xxx not found
错误的人:
.formatter.myformatter
和mynamespace.Formatter.myformatter
都在工作。
解析格式化程序的逻辑在sap.ui.base.BindingParser.resolveRef(oBindingInfo,'formatter')
中 BindingParser
在sapUI5(1.54)和openUI5中似乎有所不同。我以sapUI5版本为例。
如果格式化程序名称以点('。')开头,例如.formatter.myformatter
,查找将从给定上下文(视图的控制器)开始,否则(“ mynamespace.Formatter.myformatter”)它将从全局上下文(窗口)开始。
和jQuery.sap.getObject("formatter.myformatter", oContext)
或jQuery.sap.getObject("mynamespace.Formatter.myformatter", window)
被调用。
所以如果出现formatter function xxx not found!
错误。在jQuery.sap.getObject
中设置一个断点,并检查oContext或window对象中是否存在“ myformatter”。
我发现我的窗口对象中没有mynamespace.Formatter.myformatter
。所以我从
sap.ui.define([], function() {
return {
myformatter: function () {}
}
})
收件人
sap.ui.define([], function() {
var Formatter = {
myformatter: function () {}
}
return Formatter
}, /* bExport */ true)
它正在工作。
答案 2 :(得分:0)
格式化程序必须使用变量定义。格式化程序参考必须包含在控制器中。格式化程序必须使用绝对路径引用。
Formatter.js
sap.ui.define([], function () {
var Formatter = {
myFormatter: function () {
return "";
}
}
return Formatter }, /* bExport */ true)
View.controller.js
sap.ui.define([
...
"com/my/company/utils/Formatter"], function (..., Formatter) {
"use strict";
return Controller.extend("com.my.company.View", {
View.view.xml
<GenericTag status="{path: 'MyStatus', formatter: 'com.my.company.utils.Formatter.myFormatter'}/>