在XML视图中将静态值传递给Formatter参数

时间:2016-05-19 07:57:40

标签: sapui5

我想用两个参数调用函数getCountdown

  • 第一个(AuctionEnd)来自a的动态 模型。
  • 第二个应在"Time""Status"中进行硬编码。

这是我的代码:

<ObjectStatus
  title="Time"
  text="{
    parts: [
      {path: 'AuctionEnd'},
      {path: 'Time'}
    ],
    formatter: '.formatter.getCountdown'
  }"
/>

在formatter.js中,我的控制台日志中只有第一个参数:

["2016-05-20T12:00:00", undefined]

在JS中,我会这样做:

var AuctionEnd = "2016-05-20T12:00:00";
getCountdown(AuctionEnd, "Time");

6 个答案:

答案 0 :(得分:4)

从1.61 [commit] 开始,您可以将静态值添加到绑定信息对象。语法为value,而不是path

parts: [
  {path: '/modelPath'},
  {value: 123}
],
...

path一样,您可以通过更多设置来增强value绑定信息,如本演示所示:https://jsbin.com/yeguhow/edit?js,output

答案 1 :(得分:1)

要将静态值传递给格式化程序,可以使用不带翻译的i18n模型(因为如果您查找i18n.prop中不存在的属性,它将返回您要查找的关键字):

我试图将'X,,X'表示为复选框列表:

midiInOpen()

在这种情况下,当我重新确认自己甚至不需要格式化程序时,我便采用了不同的方法:

// will format the first of values boolvalues.split(',')[index]
selected="{parts: [ 'modelName>/boolvalues', 'i18n>0'], formatter: '.formatter.checkBoxFormatter'}" 

答案 2 :(得分:1)

版本<1.61的解决方案:

  1. 注册模型以使用init方法查看

    onInit: function() { // JSONModel required from "sap/ui/model/json/JSONModel"
      var oModelConstants = new JSONModel(Object.freeze({ myConstant: 123 }));
      oModelConstants.setDefaultBindingMode("OneTime");
      this.getView().setModel(oModelConstants, "constants");
    }
    
  2. 在XML视图中,为格式化程序分配以下部分:

    <ObjectStatus text="{
      parts: [
        'AuctionEnd',
        'constants>/myConstant'
      ],
      formatter: '.formatter.getCountdownTime'
    }" />
    

对于1.61及更高版本,请参见answer 53609552

答案 3 :(得分:1)

我发现了另一种可能性,也许不是完全针对该问题的用例,但这是我发现此问题时要寻找的东西。

如果您要设置的“常量”或“静态”文本是实际的可翻译文本,则可以在i18n模型中对其进行定义,然后按以下方式进行访问:

<ObjectStatus
  title="Time"
  text="{
    parts: [
      {path: 'AuctionEnd'},
      {path: 'i18n>/Time'}
    ],
    formatter: '.formatter.getCountdown'
  }"
/>

也许更合适的用例是设置表列的标题,并从模型到末尾添加一个单位,例如:“ Space [m ^ 2]”。由于无论如何都必须翻译“空间”,因此您可以直接从模型中拉出它。

答案 4 :(得分:0)

据我所知,您无法向格式化程序添加静态部分,它只能获取模型值。有关属性中动态和静态部分的组合,请参阅Expression BindingComplex Binding Syntax

对于您的情况,您可以添加两个更专业的格式化程序函数并调用您需要的函数:

<ObjectStatus text="{parts: ['AuctionEnd'], formatter: '.formatter.getCountdownTime'}" />

(您可以在部分数组中提供路径 - 字符串数组。)

formatter.getCountdownTime = function (auctionEnd) {
    return formatter.getCountdown(auctionEnd, "Time");
}

formatter.getCountdownStatus = function (auctionEnd) {
    return formatter.getCountdown(auctionEnd, "Status");
}

答案 5 :(得分:0)

我认为@hirse方面是正确的,而不能将静态部分添加到格式化程序中。

我建议您将静态值放入> / countdownType之类的ViewModel-Property中。然后,在绑定objectstatus-text之前(也在您的控制器中)在控制器中设置此属性。对于这种方法,您必须给您的ObjectStatus一个ID。然后,您可以将属性文本与格式化程序绑定。

您的格式化程序看起来像这样:

    getCountdown: function(auctionEnd){

        var sType = this.getView().getModel("<yourviewmodelname>").getProperty("/countdownType");
        //whatever you want to do

    }

您的控制器是这样的:

var sType = "<yourLogicToDefineEitherTimeOrStatus>";
this.getView().getModel("<yourviewmodelname>").setProperty("/countdownType", sType);

var oObjectStatus = this.getView().byId("<yourNewImplementedObjectStatusId>");
oObjectStatus.bindProperty("text", {
    path: "AuctionEnd",
    formatter: this.formatter.getCountdown.bind(this)
});

希望这会有所帮助。

关于, 迈克