xf:dispatch基于上下文节点的动态事件名称失效问题排查
XForms中Group/Repeat组件的上下文节点丢失问题
我尝试基于实例内容定义一组按钮,将动作置于模型中以简化视图结构,使用dispatch元素触发动态命名的事件(通过name元素)。
发现在group或repeat组件中节点上下文似乎丢失:测试用例里,硬编码显式XPath的场景可正常工作,但隐式或显式引用上下文节点的测试均失效。测试代码如下:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="declarative4all/build/xsl/xsltforms.xsl" type="text/xsl"?> <?xsltforms-options debug="no"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ht="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" lang="en"> <head> <xf:model id="model"> <xf:instance> <data xmlns=""> <button name="b1" icon="arrow_upward"/> <button name="b2" icon="arrow_downward"/> </data> </xf:instance> <xf:action ev:event="b1"> <xf:message>b1</xf:message> </xf:action> <xf:action ev:event="b2"> <xf:message>b2</xf:message> </xf:action> </xf:model> </head> <body> <h1>TEST 1: hardcoded XPath in name element (works)</h1> <xf:trigger id="t1"> <xf:label ref="button[1]/@name"/> <xf:dispatch ev:event="DOMActivate"> <xf:targetid>model</xf:targetid> <xf:name value="button[1]/@name"/> </xf:dispatch> </xf:trigger> <h1>TEST 2: XPath implicit reference to context node (doesn't work)</h1> <xf:group ref="button[1]"> <xf:trigger id="t2"> <xf:label ref="@name"/> <xf:dispatch ev:event="DOMActivate"> <xf:targetid>model</xf:targetid> <xf:name value="@name"/> </xf:dispatch> </xf:trigger> </xf:group> <h1>TEST 3: XPath explicit reference to context node (doesn't work)</h1> <xf:group ref="button[1]"> <xf:trigger id="t3"> <xf:label ref="context()/@name"/> <xf:dispatch ev:event="DOMActivate"> <xf:targetid>model</xf:targetid> <xf:name value="context()/@name"/> </xf:dispatch> </xf:trigger> </xf:group> </body> </html>
已找到临时解决方案:由于按钮将置于repeat组件中,可使用index()函数定位正确节点,代码如下:
<xf:repeat id="r2" ref="button"> <xf:input ref="@name"/> <xf:input ref="@icon"/> <xf:trigger> <xf:label ref="@name"/> <xf:action ev:event="DOMActivate"> <xf:dispatch> <xf:targetid>model</xf:targetid> <xf:name value="instance()/button[index('r2')]/@name"/> </xf:dispatch> </xf:action> </xf:trigger> </xf:repeat>
内容的提问来源于stack exchange,提问作者monojohnny
相关产品推荐
相关产品推荐

