You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Titanium Alloy中如何将对象从XML视图传递至JavaScript控制器

如何从SAPUI5 XML视图传递自定义属性到JavaScript控制器

嘿,我来帮你搞定这个问题!看你已经在XML的ListItem里加了自定义属性argsForController,接下来分几步就能把这个数据传到JS控制器里:

1. 先把XML里的属性写规范

你提供的代码有点截断,我先补全并调整成规范的写法(重点注意JSON字符串的引号):

<ListItem 
  template="menuItemTemplate" 
  itemTitle:text="My Open Tickets" 
  itemId="openTickets" 
  itemCountContainer:visible="true" 
  itemCount:text="" 
  routeTo="/fulfiller/openCloseTicketsList" 
  argsForController='{"ticketType":"open"}'
></ListItem>
<ListItem 
  template="menuItemTemplate" 
  itemTitle:text="My Close Tickets" 
  itemId="closedTickets" 
  itemCountContainer:visible="true" 
  itemCount:text="" 
  routeTo="/fulfiller/openCloseTicketsList" 
  argsForController='{"ticketType":"closed"}'
></ListItem>

这里要注意:JSON字符串必须用单引号包裹,不然XML的双引号会和JSON里的双引号冲突,导致解析错误,这是很多人踩过的坑!

2. 在控制器里获取并使用自定义属性

假设你是通过press事件来处理这个列表项的操作,控制器代码可以这么写:

onMenuItemPress: function(oEvent) {
  // 拿到触发事件的ListItem控件
  const oListItem = oEvent.getSource();
  // 获取自定义属性的值
  const sArgsJson = oListItem.data("argsForController");
  // 把JSON字符串转成JS对象
  const oControllerArgs = JSON.parse(sArgsJson);
  
  // 接下来就可以用这个参数啦,比如跳转路由的时候带上
  const oRouter = this.getOwnerComponent().getRouter();
  oRouter.navTo(oListItem.data("routeTo"), {
    ticketType: oControllerArgs.ticketType
  });
}

更规范的写法:用data-*前缀

SAPUI5官方推荐用data-开头的自定义属性,这样能避免和控件本身的内置属性冲突,调整后的XML:

<ListItem 
  template="menuItemTemplate" 
  itemTitle:text="My Open Tickets" 
  itemId="openTickets" 
  itemCountContainer:visible="true" 
  itemCount:text="" 
  data-route-to="/fulfiller/openCloseTicketsList" 
  data-args-for-controller='{"ticketType":"open"}'
></ListItem>

控制器里获取的方式也对应调整:

onMenuItemPress: function(oEvent) {
  const oListItem = oEvent.getSource();
  const oControllerArgs = JSON.parse(oListItem.data("args-for-controller"));
  const sRoute = oListItem.data("route-to");
  
  // 后续逻辑...
}

3. 动态参数的情况

如果你的参数是动态绑定的(比如来自模型),可以直接绑定对象,不用写JSON字符串:

<ListItem 
  template="menuItemTemplate" 
  itemTitle="{i18n>openTickets}" 
  data-args-for-controller='{ticketType: "open"}'
></ListItem>

这种情况下,控制器里直接获取对象就行,不用JSON.parse:

const oControllerArgs = oListItem.data("args-for-controller");

几个关键提醒

  • 一定要注意XML里的引号冲突问题,JSON字符串用单引号是最稳妥的。
  • 尽量用data-*格式的自定义属性,减少和控件内置属性冲突的风险。
  • 如果JSON格式写错了,JSON.parse会抛出错误,记得在控制台检查报错信息。

内容的提问来源于stack exchange,提问作者mukesh.kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:02:26