XForms双实例绑定问题:Repeat内绑定instance2失效求助
解决两个XML实例同步单选按钮值的问题
嘿,我看你在尝试把单选按钮的输入同时绑定到两个XML实例时遇到了同步失效的问题——原来的bind写法没起作用是因为没精准匹配到对应节点,我来给你两个靠谱的解决思路:
方案1:用ID匹配的Bind表达式(最简洁)
你之前的bind之所以失效,是因为直接取了instance1里所有tree/@show的值,但循环instance2的节点时,没法对应到同一个id的节点。我们可以利用两个实例里tree的id属性来精准匹配,修改bind的写法:
<xf:bind ref="instance('instance2')/example/tree/@show" calculate="instance('instance1')/some/example/tree[@id = current()/../@id]/@show" />
这个写法不需要用repeat包裹bind——bind本身就能作用于所有匹配的节点。current()/../@id会拿到当前instance2中tree节点的id,然后在instance1里找到对应id的tree节点,把它的show属性值同步过来,所有节点都会自动保持一致。
方案2:在单选按钮变更时主动同步(更可控)
如果bind的自动同步方式不符合你的需求,也可以给instance1的单选按钮加个事件,每次值变化时主动把值同步到instance2:
<xf:repeat id="fl" nodeset="instance('instance1')/some/example/tree"> <xf:select1 ref="@show"> <xf:label><xf:output ref="../label" /></xf:label> <xf:item> <xf:label>yes</xf:label> <xf:value>true</xf:value> </xf:item> <xf:item> <xf:label>No</xf:label> <xf:value>false</xf:value> </xf:item> <!-- 触发值变更时同步到instance2 --> <xf:action ev:event="xxf:value-changed"> <xf:setvalue ref="instance('instance2')/example/tree[@id = current()/@id]/@show" value="current()/@show" /> </xf:action> </xf:select1> </xf:repeat>
这样用户每次点单选按钮选值时,都会触发这个事件,找到instance2里同id的tree节点,把新值同步过去,适合需要明确控制同步时机的场景。
为啥原来的方法不行?
你之前用repeat包bind的写法有两个问题:
- 循环instance2的节点时,bind里的calculate直接取了instance1所有
tree/@show的集合,不是当前循环对应的那个节点,所以没法正确赋值; - 其实bind不需要用repeat来遍历节点,它本身就可以处理节点集合,只要表达式能精准匹配对应节点就行。
内容的提问来源于stack exchange,提问作者sree
相关产品推荐
相关产品推荐

