Как мне заполнить и модели XForms значением и текстом Select1? - PullRequest
2 голосов
/ 25 июля 2011

Я довольно новичок в XForms, и у меня возникают проблемы при попытке найти решение, которое кажется относительно тривиальной проблемой.У меня есть элемент управления select1 в моей форме, и я хочу связать элемент в моей модели как с выбранным значением, так и с выбранным текстом элемента управления, чтобы я мог сохранить оба значения при отправке формы.

Моя модель выглядит примерно так:

<model>
<valueofselect/>
<textofselect/>
</model>

Не мог бы один из вас, гуру XForms, опубликовать небольшой пример того, как этого можно добиться.

Заранее большое спасибо.

1 Ответ

2 голосов
/ 25 июля 2011

Для этого есть разные способы:

  • с помощью xforms: setvalue для установки значения узла /model/textofselect;
  • с использованием xforms: связать с calculate свойство для динамического задания значения узла /model/textofselect.

Пример:

Вот полная форма xforms, демонстрирующая второе решение.Первый способ будет выглядеть аналогично, самая важная часть (XPath) будет одинаковой в обоих решениях.

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xforms="http://www.w3.org/2002/xforms">
<head>
<title>Select1 - get value and label</title>
<xforms:model id="main-model">
    <xforms:instance id="data">
        <model xmlns="">
            <valueofselect/>
            <textofselect/>
        </model>
    </xforms:instance>
    <xforms:instance id="items">
        <items xmlns="">
            <item>
                <label />
                <value />
            </item>
            <item>
                <label>label a</label>
                <value>value a</value>
            </item>
            <item>
                <label>label b</label>
                <value>value b</value>
            </item>
            <item>
                <label>label c</label>
                <value>value c</value>
            </item>
        </items>
    </xforms:instance>
    <xforms:bind
         nodeset="instance('data')/textofselect"
         calculate="instance('items')/item[value eq
                    instance('data')/valueofselect]/label/text()" />
</xforms:model>
</head>
<body>
    <h1>Select...</h1>
    <xforms:select1 ref="instance('data')/valueofselect">
        <xforms:itemset nodeset="instance('items')/item">
            <xforms:label ref="label"/>
            <xforms:value ref="value"/>
        </xforms:itemset>
    </xforms:select1>
    <h1>Selection result</h1>
    <xforms:output ref="instance('data')/valueofselect">
        <xforms:label>Selected value: </xforms:label>
    </xforms:output><br />
    <xforms:output ref="instance('data')/textofselect">
        <xforms:label>Selected Value's label: </xforms:label>
    </xforms:output>
</body>
</html>

Объяснение:

xforms:bind заставляет механизм XForms вычислятьзначение узла /model/textofselect в зависимости от значения узла /model/valueofselect.Для этого он выбирает текстовое значение выбранного элемента из списка элементов с использованием предиката XPath.

Чтобы сделать элементы select1 доступными для привязки, они не определяются как дочерние элементы xforms:select1 узел.Вместо этого они помещаются в xforms:model с использованием элемента xforms:itemset .

...