【问题标题】:SAPUI5: DOM change commands interfere with each otherSAPUI5:DOM 更改命令相互干扰
【发布时间】:2018-02-21 21:02:52
【问题描述】:

我的列表绑定:

<StandardListItem 
  title="{NewProposalTitle_DE}" 
  description="Stream: {Stream}, Time: {starttime}" 
  press="handlePress" 
>

当用户是英语时,我想将 oData 模型中的title 绑定更改为title="{NewProposalTitle_EN}"

我研究了表达式绑定,但这似乎不适用于动态数据:

title="{= {language} === "de" ? {NewProposalTitle_DE} : {NewProposalTitle_EN} }

所以我尝试了一种不同的方法,我遍历 SAPUI5 列表中的所有项目,如果用户的语言是英语,我想将(德语)title 属性更改为英语,并向项目的添加一个数字counter 属性。

var Items = this.getView().byId("idList").getItems();
for (var i = 0; i < Items.length; ++i) {
  if(language === "en"){
    Items[i].setTitle(oData.results[i].Title_EN);
  }
  Items[i].setCounter(numbers[i]);
}

如果语言是德语,一切都像魅力一样,并且计数器设置正确,但如果语言是英语,事情就会变得可疑。 当标题用英文标题更新时,计数器设置回 0(默认值)。更奇怪的是,如果德文版和英文版标题相同(因此无需更改),计数器仍会显示(我假设 SAPUI5 足够聪明,可以识别,无需更改)。

我在尝试为项目添加样式类时遇到了同样的问题:

Items[i].addStyleClass("blue");

同样,只要 title 不被更改,它就可以工作。

我尝试以各种可能的方式更改顺序,但没有成功。 我还尝试了setCounteraddStyleClass 并省略了setTitle 命令,但只有一个影响了DOM。

【问题讨论】:

    标签: javascript sapui5


    【解决方案1】:

    请不要这样翻译!您最终可能会覆盖其他模型中的数据。使用 i18n 资源模型进行翻译!这是将应用程序中的任何文本翻译成任何其他语言的内置方式。

    SAPUI5 默认加载正确的。

    如果您的浏览器语言设置为德语,它会首先尝试加载i18n_de_DE.properties,(不确定德语的确切名称,您可以查看浏览器的网络选项卡了解。可能是只是_de.properties,如果有_de_AT之类的东西),然后再回到默认的i18n.properties

    如果您从任何常用的 IDE(如 webIDE 或 eclipse)启动应用程序,则模型已经为您创建好了。

    想法是将标题设置为标识符,例如

    <Label text={i18n>MY_TRANSLATABLE_TEXT} />
    

    在您的 i18n.properties 文件中,您可能会默认使用英语:

    MY_TRANSLATABLE_TEXT=Customer
    

    虽然您的德语属性文件有

    MY_TRANSLATABLE_TEXT=Kunde
    

    然后为您完成翻译,而无需尝试直接弄乱标题。

    【讨论】:

    • 我知道 i18n 并将其用于静态文本。我不认为 i18n 在这里对我有帮助,因为我从 OData 服务获得了标题。我尝试更改标题属性的绑定:从 text={NewProposalTitle_DE}title={NewProposalTitle_EN} 但绑定不起作用,我得到的只是标题是静态字符串“{NewProposalTitle_EN}”。然后我尝试了上面描述的不同方法,遍历项目并手动更改标题。 (见上面的编辑)
    【解决方案2】:

    谢谢大家的回答!我找到了解决问题的方法:

    在控制器中,我检查用户语言并更新属性绑定:

    Items[i].bindProperty("title", "NewProposalTitle_EN");
    

    这可能不是最优雅或最正确的方式,但它对我有用(目前)。

    希望大家今天过得愉快!

    【讨论】:

      【解决方案3】:
      title="{= {language} === "de" ? {NewProposalTitle_DE} : {NewProposalTitle_EN} }
      

      您的expression binding 中有一些语法问题。试试这个:

      title="{= ${language} === 'de' ? ${NewProposalTitle_DE} : ${NewProposalTitle_EN} }"
      

      除此之外,我认为将可翻译文本作为属性放入实体集中并不是一个好主意。我建议将每种语言翻译的字段标签(例如NewProposal 属性)定义为UI text annotation (如sap:label)。

      创建 ODataModel 后,将立即使用相应的语言查询 sap-language =&lt;automatically detected&gt; 请求服务元数据。

      因此,属性标签已经从后端系统翻译过来,包含在元数据中,您可以通过特殊的属性绑定语法将其绑定到视图中。例如:

      在元数据中

      <EntityType Name="BusinessPartner" sap:content-version="1">
        <Key>
          <PropertyRef Name="BusinessPartnerID" />
        </Key>
        <Property Name="BusinessPartnerID" Type="Edm.String"
          sap:label="Business Partner ID"
          sap:creatable="false"
          sap:updatable="false"
        />
        ...
      </EntityType>
      

      Property Metadata Binding

      <StandardListItem 
        title="{myModelName>BusinessPartnerID/#@sap:label}" 
        press=".handlePress" 
      />
      

      【讨论】:

      • 感谢您更正了表达式绑定!我担心我不完全理解属性元数据绑定,但无论如何感谢您的替代解决方案!
      • @joelplambeck 我扩展了我的答案,并包含了一些解释如何利用属性元数据绑定的链接。
      • 感谢您提供的链接,看起来非常有趣且功能强大。看起来像处理像我这样的情况的正确方法......但是如何将属性配置为sap:label
      • @joelplambeck GW 开发人员应该能够将每个字段中的文本(短、中、长、标题和描述)配置为explained here,然后在@ 的每个属性中生成sap:label 987654338@ 内部元数据。不幸的是,我在后端没有任何专业知识。所以我不知道它是如何在 GW 中完成的。让我知道你是否能解决它!
      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 2013-05-09
      • 2011-07-14
      • 2021-04-08
      相关资源
      最近更新 更多