格式化程序功能在XML片段中不起作用

时间:2019-05-11 20:06:26

标签: xml sapui5 sap hana formatter

我的Controller文件中有一个名为“ formatCurrency”的函数,但是我无法获取XML Fragment来使用它。

这是我Controller.js文件中的函数:

form_widget(form)

这是我使用它的XML片段文件的一部分:

formatCurrency : function(value){
    var d = ".";
    var t = ",";
    var c = 2;
    var p = "$";
    c = isNaN(c = Math.abs(c)) ? 2 : c;
    var s = value < 0 ? "-" : "";
    var i = parseInt(value = Math.abs(+value || 0).toFixed(2)) + "";
    var j = (j = i.length) > 3 ? j % 3 : 0;
    return p + s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(value - i).toFixed(2).slice(2) : "");

我读到某个地方必须实例化片段?我真的很陌生,所以我不确定该怎么做。我不知道如何将我看到的例子应用于我的案子。

PD:在普通的View.xml文件中使用时,该功能可以完美运行。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

以下是使它对我有用的4个步骤:

创建格式化程序

格式化程序文件在 webapp \ model 中定义。

sap.ui.define([], function() {
    "use strict";
    return {
        formatNumber: function(value) {
            var result = "";
            if (value !== "undefined" && isNumeric(value)) {
                result = Number(value).toFixed(2);
            }
            return result;
        }
    };
});

扩展控制器

sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "myapp/html/model/formatter"
], function(Controller, formatter) {
    "use strict";
    return Controller.extend("myapp.html.controller", {
        formatter: formatter,

        // your code


    });
});

您可以在代码中看到以下内容:

  • 在定义部分添加格式化程序类
  • 扩展函数参数
  • 将格式化程序定义为本地变量,然后在您的视图/片段中将其引用为 .formatter

在片段中使用格式化程序

<Text text="{path : 'results>value', formatter : '.formatter.formatNumber'}"/>

您可以在代码中看到以下内容:

  • 我有一个名为 results 的模型,要显示的属性为 value (但这取决于您的代码)
  • 它使用 扩展 方式定义 Text 控件 text 属性

在您的视图中包含片段

<ui:core.Fragment fragmentName="myapp.html.fragment.myfragment" type="XML"/>

当然,在添加属性之前,应始终确保在不使用格式程序的情况下显示属性。

希望这会有所帮助

答案 1 :(得分:1)

无论使用什么地方,我都怀疑绑定中可能存在问题。可以这样访问命名的JSON模型中的属性(模型> / Price而不是模型> Price)-({{3} })

<Label text="Price" />
<ObjectNumber number = "{path : 'model>/Price', formatter : '.formatCurrency'}" />

您是否正在Fiori elements应用程序中使用此片段/进行对话?在手动使用片段的情况下,必须实例化它。更重要的是,您需要确保已使用sap.ui.model.json.JSONModel

实例化了JSON模型
this.getView().setModel(new sap.ui.model.json.JSONModel({
            Price: 23,
            .. : .., //Other properties in the model
            .. : ..
        }), "model");

答案 2 :(得分:0)

如果您通过JavaScript调用片段,则必须为视图“注册”它(其他绑定如i18n和formatter无效)

class Customer {
    String name
    String email
    String phone
}

String infoLine = "Stanislav,stanislav@stackoverflow.com,004612345678" 

def customer = [
    Customer.declaredFields.findAll { !it.synthetic }*.name,
    infoLine.split(',')
].transpose().collectEntries() as Customer

Deprecated since version 1.58

sap.ui.core.Fragment.load({
    type: "XML",
    name: '<Namespace>.myFragment'
}).then(function (oFragment) {
    this.getView().addDependent(oFragment);
}.bind(this));

另请参见文档:
Example From Tutorial
addDependent