Sapui5 如何在XMLView中将控件引用传递给格式化程序?

Sapui5 如何在XMLView中将控件引用传递给格式化程序?,sapui5,Sapui5,在SAPUI5的JSView中,将当前控件引用传递给格式化程序函数非常容易: oTable.bindItems(“/rows”,新sap.m.ColumnListItem({ 单元格:[新建sap.m.Text().bindProperty(“文本”{ 部分:[ {path:“someInteger”} ], 格式化程序:函数(iValue){ var idText=this.getId();//此引用当前控件 返回伊瓦鲁; } })] })); (当然“简单”部分是因为控件的内部格式化程序函

在SAPUI5的JSView中,将当前控件引用传递给格式化程序函数非常容易:

oTable.bindItems(“/rows”,新sap.m.ColumnListItem({
单元格:[新建sap.m.Text().bindProperty(“文本”{
部分:[
{path:“someInteger”}
],
格式化程序:函数(iValue){
var idText=this.getId();//此引用当前控件
返回伊瓦鲁;
}
})]
}));
(当然“简单”部分是因为控件的内部格式化程序函数中引用了此)

但是,对于XMLViews,我还没有在formatter函数中获得对当前控件的引用:


以及格式化程序:

formatCell:函数(sValue){
var a=this;//它引用控制器
返回值;
}

有人知道如何在XMLViews中实现这一点吗?

在单独的文件中定义格式化程序函数。然后,
将是正在格式化其属性的控件

my/own/Formatter.js:

sap.ui.define(函数(){
“严格使用”;
返回{
formatCell:函数(iValue){
var idText=this.getId();//此引用当前控件
返回伊瓦鲁;
}
};
});
视图:


在这方面@codeworrior的回答更清楚:

在视图的控制器中搜索以点(例如“.foo”)开头的名称,执行上下文将强制成为控制器

所有其他名称都是从窗口对象开始解析的,它们将控件/元素作为保存绑定的上下文


只需补充@hirse的答案,对于那些获得
格式化程序函数xxx未找到的人
错误:

.formatter.myformatter
mynamespace.formatter.myformatter
都在工作

解析格式化程序的逻辑在中

BindingParser
在和中似乎有所不同。我将以sapUI5版本为例

如果格式化程序名称以点('.')开头,例如
.formatter.myformatter
,则查找将从给定上下文(视图的控制器)开始,否则(“mynamespace.formatter.myformatter”)将从全局上下文(窗口)开始

调用
jQuery.sap.getObject(“formatter.myformatter”,oContext)
jQuery.sap.getObject(“mynamespace.formatter.myformatter”,window)

因此,如果您得到
格式化程序函数xxx未找到错误。在
jQuery.sap.getObject
中设置断点,并检查oContext或window对象中是否有“myformatter”

我发现在我的窗口对象中没有
mynamespace.Formatter.myformatter
。所以我将格式化程序从

sap.ui.define([], function() {
  return {
    myformatter: function () {}
  }
})


格式化程序必须用变量定义。控制器中必须包含格式化程序引用。格式化程序必须使用绝对路径引用

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'}/>

我无法让它工作,指南中说要在控制器中包含格式化程序,并在控制器中设置
formatter:formatter
。之后,我可以在xml视图中使用.formatter调用formatter函数。但是在那里它有视图范围,而不是元素的范围。“知道为什么吗?”迈克尔说。格式化程序模块需要导出,以便模块名称可以全局引用它。谢谢你的分析。关于“
BindingParser
在和中似乎有所不同”:后一个链接显示了自当前稳定版本(1.54)以来已收到多个更新的夜间版本(主分支)。这是否回答了您的问题?抱歉,试图引导其他读者(IMHO)更好地回答:PAs我最初的问题已经将近5年了,UI5在过去几年中发生了重大变化,是的,肯定:-)
<GenericTag status="{path: 'MyStatus', formatter: 'com.my.company.utils.Formatter.myFormatter'}/>