【问题标题】:Why is my formatter in the controller not working?为什么控制器中的格式化程序不起作用?
【发布时间】:2019-10-03 02:53:08
【问题描述】:

我已经定义了一个新的自定义模块:

status-app/formatter.js

sap.ui.define([], function() {
    "use strict";
    return {
        stringToInt: function(value) {
            console.log("Called: " + value);
            return parseInt(value);
        }
    }
});

然后在我的控制器中,我将其定义为像在演练的Step 23 中一样的依赖项,并添加为控制器属性。

sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "status-app/formatter"
], function (Controller, formatter) {
    "use strict";

    return Controller.extend("stibam-status.Main", {

        //formatter: formatter, 

        formatter: {
            stringToInt: function(value) {
                console.log(value);
                return "";
            }
        },

    [...]
});

我已经尝试了代码的两种变体,但没有调用格式化程序。我在我的 onInit-function this.formatter 中打印,但设置正确。为什么只有当我在视图本身中使用匿名函数时,我的视图才调用我的格式化程序?

不工作

oColListItem.addCell((new sap.m.Text()).bindText({ 
    path: "statusData>AnzPdf", 
    formatter: ".formatter.stringToInt"
}));

工作

oColListItem.addCell((new sap.m.Text()).bindText({ 
    path: "statusData>AnzPdf", 
    formatter: function(value) {
        console.log(value); 
        return parseInt(value);
    }
}));

【问题讨论】:

    标签: sapui5


    【解决方案1】:

    您为bindText() 方法expects a function 为其属性formatter 提供的绑定信息。它应该是这样的:

    当在Controller里面时:

    oColListItem.addCell((new sap.m.Text()).bindText({ 
        path: "statusData>AnzPdf", 
        formatter: this.formatter.stringToInt
    }));
    

    当在JSView中时:

    createContent: function(oController){
        //...
        oColListItem.addCell((new sap.m.Text()).bindText({ 
            path: "statusData>AnzPdf", 
            formatter: oController.formatter.stringToInt
        }));
        //...
    }
    

    您引用的演练使用XMLViews。在 XMLView 中,绑定信息由 XMLTemplateProcessor 从属性值(纯字符串)解析。它解析ViewController 上的“.formatter”之类的值。

    当您使用JSView 或在Controller 中创建Controls 时,您可以直接提供BindingInfo 对象。不涉及字符串解析。

    【讨论】:

    • 好的,谢谢,但现在我收到this.formatter 未定义的错误。这似乎是我当前的元素(文本元素)而不是控制器。
    • JSView.createContent() 中的代码添加了第二个示例。当在Controller 里面时,也许你必须保存你的这个? var that = this; /* ... somewhere in a callback function */ formatter: that.formatter.stringToInt
    • 如果您仍然无法使其工作,请发布更多代码,尤其是在您创建控件的上下文中。
    • @Gerrit 有什么回应吗?否则,我建议接受这个答案以帮助其他读者找到一个好的解决方案
    【解决方案2】:

    我用这段代码解决了这个问题。

    return Controller.extend("convanl.ConvAnualDesemp.controller.View1", {
    formatter: formatter,
    
    ----------------------------
        var oTemplate = new sap.m.ColumnListItem({
                            cells: [
                                   new sap.m.Text().bindText({
                                   path: "Rut", 
                                   formatter: that.formatter.entregaRutFormateado}),
                                   new sap.m.Text({
                                    text: "{DescEstado}"
                                })]});
    

    【讨论】:

    • 请避免在没有解释为什么它可以解决问题的情况下放置代码。对于问题作者来说,代码本身可能不是不言自明的。除此之外,现有答案已经提出了建议的解决方案。尝试通过提出修改建议对其进行投票或为其添加更多价值。
    猜你喜欢
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多