将ResourceBundle属性绑定到列表项

时间:2017-10-04 15:15:10

标签: javascript internationalization sapui5 resourcebundle

在SAPUI5中,您通常可以通过多种方式将资源包属性绑定到项目。我尝试使用Odata服务提供的数据在JavaScript中进行此操作,但到目前为止我在此处找到的方法尚无法解决。我尝试了两种不同的方式:

  1. How to Use Internalization i18n in a Controller in SAPUI5?

  2. binding issue with sap.m.List and model configured in manifest.json

  3. 这些都没有奏效。我觉得这是因为我在一个项目列表中,在导致我的问题的对话框中:

    我的代码是:

    printf( esc_html( _n( '%1$s review for %2$s', '%1$s reviews for %2$s', $count, 'woocommerce' ) ), esc_html( $count ), '<span>' . get_the_title() . '</span>' );
    var resourceBundle = this.getView().getModel("i18n");
    
    if (!this.resizableDialog) {
        this.resizableDialog = new Dialog({
            title: 'Title',
            contentWidth: "550px",
            contentHeight: "300px",
            resizable: true,
            content: new List({
                items: {
                    path: path,
                    template: new StandardListItem({
                        title: resourceBundle.getProperty("{Label}"),//"{ path : 'Label', fomatter : '.getI18nValue' }",
                        description: "{Value}"
                    })
                }
            }),
            beginButton: new Button({
                text: 'Close',
                press: function () {
                    this.resizableDialog.close();
                }.bind(this)
            })
        });
    

    使用上面的第二种方法,永远不要调用JavaScript方法。我认为它不会起作用,因为它更基于JSON。第一种方法,可以很好地加载数据,但它不会显示资源包文本,而只显示getI18nValue : function(sKey) { return this.getView().getModel("i18n").getProperty(sKey); }, 值内的文本。

    {Label}内找到的值与在资源包内找到的键匹配,即前面没有{Label},就像在视图中一样。

    有人有任何建议吗?

1 个答案:

答案 0 :(得分:1)

使用格式化程序可以解决您的问题,但您执行该操作的方式是错误的。试试这个,它会解决你的问题。

var resourceBundle = this.getView().getModel("i18n");
if (!this.resizableDialog) {
    this.resizableDialog = new Dialog({
        title: 'Title',
        contentWidth: "550px",
        contentHeight: "300px",
        resizable: true,
        content: new List({
            items: {
                path: path,
                template: new StandardListItem({
                   title: {
                       parts: [{ path: "Label" }],
                       formatter: this.getI18nValue.bind(this)
                   },
                   description: "{Value}"
                })
            }
        }),
        beginButton: new Button({
            text: 'Close',
            press: function () {
                this.resizableDialog.close();
            }.bind(this)
       })
    });
}

格式化程序函数 getI18nValue 将是这样的,

getI18nValue: function(sKey) {
    return this.getView().getModel("i18n").getResourceBundle().getText(sKey);
},