如何在XMLView中将控件引用传递给formatter?

时间:2015-08-26 09:22:38

标签: sapui5

在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中完成这项工作?

3 个答案:

答案 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.myformattermynamespace.Formatter.myformatter都在工作。

解析格式化程序的逻辑在sap.ui.base.BindingParser.resolveRef(oBindingInfo,'formatter')

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