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
相关产品推荐
相关产品推荐

