Можно ли отключить один из вариантов среди группы переключателей?

У меня есть переключатель с двумя элементами.

<xforms:select1 ref="add-delete" appearance="full">
    <xforms:item>
        <xforms:label>Add</xforms:label>
        <xforms:value>A</xforms:value>
    </xforms:item>
    <xforms:item>
        <xforms:label>Delete</xforms:label>
        <xforms:value>D</xforms:value>
    </xforms:item>
</xforms:select1>

Я хочу отключить только переключатель «Удалить», а не переключатель «Добавить» при условии X. Как я могу это сделать?

Я пытался использовать атрибут класса с xforms:item, но это не работает. Есть ли другой способ сделать это?


person Akshay    schedule 14.11.2011    source источник


Ответы (1)


Хороший вопрос. И, к сожалению, это не так просто сделать, как хотелось бы:

Если вы просто хотите, чтобы переключатель «Удалить» был скрыт, а не отключен, вы можете заменить <xforms:item> для «Удалить» на <xforms:itemset ref="…">, который вы привязываете к узлу, который вы делаете неактуальным, когда вы хотите, чтобы этот переключатель не отображался . Но вы не можете использовать ту же технику, чтобы отключить переключатель, привязав набор элементов к узлу, который вы сделаете доступным только для чтения. (И да, было бы хорошо, если бы вы могли это сделать.)

В нынешнем виде, я думаю, вам нужно:

  1. Создайте 2 <xforms:select1>. Один для «Добавить», один для «Удалить», так что вы можете сделать второй только для чтения при некоторых условиях.
  2. Чтобы сделать его доступным только для чтения, но не позволять «Добавить» только для чтения, вам нужно привязать их к 2 отдельным узлам.
  3. Если вы хотите иметь 1 узел с A или D, вам нужно создать вычисление для заполнения этого узла на основе 2 значений.
  4. Вы хотите, чтобы значения были исключительными, и они не будут, если у вас есть два <xforms:select1>, поэтому вам нужно отменить выбор «удалить», когда выбрано «добавить», реагируя на xforms-select, и наоборот.

В модели у вас будет:

<xforms:instance>
    <instance>
        <add/>
        <delete/>
        <add-delete/>
        <delete-enabled>true</delete-enabled>
    </instance>
</xforms:instance>
<xforms:bind ref="add-delete" calculate="string-join((../add, ../delete), ' ')"/>
<xforms:bind ref="delete" readonly="../delete-enabled = 'false'"/>

И в представлении:

<xforms:select1 ref="instance()/add" appearance="full">
    <xforms:item>
        <xforms:label>Add</xforms:label>
        <xforms:value>A</xforms:value>
    </xforms:item>
    <xforms:setvalue ev:event="xforms-select" ref="instance()/delete"/>
</xforms:select1>
<xforms:select1 ref="instance()/delete" appearance="full">
    <xforms:item>
        <xforms:label>Delete</xforms:label>
        <xforms:value>D</xforms:value>
    </xforms:item>
    <xforms:setvalue ev:event="xforms-select" ref="instance()/add"/>
</xforms:select1>

Полный исходный код этого примера см. в этой сути.

person avernet    schedule 15.11.2011
comment
Спасибо за решение. Я попытаюсь посмотреть, смогу ли я добавить дополнительные узлы в свою форму. В противном случае я должен скрыть переключатель вместо его отключения. - person Akshay; 15.11.2011