Управление Видимостью

Тема в разделе "Lotus - Xpages", создана пользователем rrr, 25 июн 2013.

  1. rrr

    rrr Active Member

    Регистрация:
    3 мар 2013
    Сообщения:
    36
    Симпатии:
    0
    Коллеги, подскажите, pls, в чем может быть дело. Пробую показывать/прятать элемент liMembers (типа listbox) в зависимости от содержимого элемента cbType (типа combobox). Если содержимое "Договор", то показывать. если нет, то прятать.

    Пробую на стороне клиента

    var idType = '#{java script:getClientId("cbType")}';
    var idMembers = '#{java script:getClientId("lbMembers")}';

    Код (LotusScript):
    var ourValue = document.getElementById(idType).value;
    var visibility;
    if (ourValue == 'Договор')
    visibility = 'visible';
    else
    visibility = 'hidden';
    document.getElementById(idMembers).style.visibility=visibility;
    и на стороне сервера

    Код (LotusScript):
    var combo:javax.faces.component.UIComponent = getComponent("cbType");
    var comboVal = combo.getValue();
    var lbMembers:javax.faces.component.UIComponent = getComponent("lblMembers");
    if (comboVal == "Договор")
    lbMembers.setRendered(true);
    else
    lbMembers.setRendered(false);

    В обоих случаях получаю сообщение браузера "Непредвиденная ошибка среды выполнения":
    Источник ошибки
    Имя страницы:/Document.xsp
    Исключительная ситуация
    ► Трассировка стека

    Что может быть не так?

    UPD: поместил оба элемента на одну панель, переключил обновление на частичное, только панели - перестало ругаться, но и работать не начало. Что еще может быть?
     
  2. lmike

    lmike нет, пердело совершенство
    Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    в трассировке, кот. отсут. и написано - что не так
     
  3. rrr

    rrr Active Member

    Регистрация:
    3 мар 2013
    Сообщения:
    36
    Симпатии:
    0
    Поместил элементы на панель и переключил форму на обновление только панели. Сообщение об ошибке пропало, но lbMembers все время виден. Может, еще что подскажете?
     
  4. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
  5. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Как-то сложно все пишите/выдумываете.

    Server JS
    <!--shcode--><pre><code class='java'>getComponent("elementName").getValue();
    getComponent("elementName").setValue("something");[/CODE]
    Note: you cannot access or set fields with visible=false. If you want to work with a field, but don't want to display it, give the field a CSS class with "display:none".
    Get submitted value before validation
    <!--shcode--><pre><code class='java'>getComponent("elementName").getSubmittedValue()[/CODE]
    Client JS
    <!--shcode--><pre><code class='java'>document.getElementById("#{id:elementID}").value;[/CODE]
    Get a computed field's value:
    <!--shcode--><pre><code class='java'>document.getElementById("#{id:elementID}").innerHTML;[/CODE]
    Код скрытия надо писать сразу в свойстве Visible компонента. Например так
    Код (Text):
    var tmp = getComponent("inputText8").value
    tmp == "Абонентский"
    и обновлять его при помощи Partial refresh или Submit
     
  6. rrr

    rrr Active Member

    Регистрация:
    3 мар 2013
    Сообщения:
    36
    Симпатии:
    0
    Да, так попроще будет... Спасибо!
     
  7. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    И получить ошибку, если "inputText8" скрыт :)
    Для SSJS, в коде скрытия (Visible компонента) удобно проверять Scope variable. Работает при полном и частичном обновлении.
    Для CSJS, Visible компонента - Static и управлять видимостью:
    document.getElementById("#{id:xxx}").style.display = "inline"
    document.getElementById("#{id:xxx}").style.display = "none"
    но это только при Partial Refresh компонента.
     
  8. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Очень интересно. Видимое поле ссылается на невидимое... это как?
    Всегда должен быть видимый набор полей, от которого "пляшут" дальше.

    alexas, явно не читал что написано:
    Note: you cannot access or set fields with visible=false. If you want to work with a field, but don't want to display it, give the field a CSS class with "display:none".

    И собственно Visible это не просто скрытие компонента, это так сказать "физическое удаление" его со станицы. Т.е. компонент не подгружает данные. Выгода от этого очевидная.
    Одно дело спрятать просто текстовое поле - другое дело спрятать вид или ричтекст.
    Так что я не был бы на столько уверенным, что твое решение лучше. И уж тем более так настоятельно не рекомендовал бы его.

    Мой пример ссылается на видимое поле. И я написал что это пример.

    А вообще, если правильно все делать - ошибки не будет. Должна быть правильно построена логика скрытия.
    1. можно обновлять панель/таблицу/ячейку и т.д., в которой находится компонент
    2. можно обновлять всю страницу
    3. можно вычислять какой компонент нужно обновить

    Но чтоб не заморачиваться - лучше обновлять группу компонентов (панели, таблицы и т.д.), а не городить огороды из SSJS, CSJS и CSS. Сам потом с ума сойдешь, когда забудешь что и для чего писал
    Или считаешь что большое количество кода показывает крутизну программиста?
     
  9. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    NickProstoNick конечно, если логика скрытия нескольких элементов одинакова, надо управлять всей группой. Я и не утверждал обратного.
    Вкурсе. А вот рабочий пример CSJS на скорую руку (примерно, о чем спрашивал rrr)
    Код (Text):
    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:panel id="pane">
    <xp:listBox id="liMembers">
    <xp:selectItem itemLabel="Untitled"></xp:selectItem>
    <xp:selectItem itemLabel="Untitled"></xp:selectItem>
    </xp:listBox>
    <xp:label id="label1"></xp:label></xp:panel>
    <xp:br></xp:br>
    <xp:comboBox id="cbTipe">
    <xp:selectItem itemLabel="Договор" itemValue="Договор"></xp:selectItem>
    <xp:selectItem itemLabel="Недоговор" itemValue="Недоговор"></xp:selectItem>
    <xp:eventHandler event="onchange" submit="true"
    refreshMode="partial" refreshId="pane">
    <xp:this.onComplete><![CDATA[var check = document.getElementById("#{id:cbTipe}").value;
    if(check == "Договор"){
    document.getElementById("#{id:pane}").style.display = "inline";
    }
    else {
    document.getElementById("#{id:pane}").style.display = "none";
    };]]></xp:this.onComplete>
    <xp:this.script>
    <xp:executeClientScript>
    <xp:this.script><![CDATA[if(document.getElementById("#{id:cbTipe}").value == "Документ"){
    document.getElementById("#{id:pane}").style.display = "inline";
    }
    else {
    document.getElementById("#{id:pane}").style.display = "none";
    } ]]></xp:this.script>
    </xp:executeClientScript>
    </xp:this.script>
    </xp:eventHandler>
    </xp:comboBox></xp:view>
    А по поводу
    var tmp = getComponent("inputText8").value
    tmp == "Абонентский"

    я имел ввиду, что товарищ применит этот код для скрытия "влоб" и получит ошибку (судя по вопросу - изучение хепагов в самом начале, а логика программирования в них сильно отличается от классических нотусов)
     
  10. rrr

    rrr Active Member

    Регистрация:
    3 мар 2013
    Сообщения:
    36
    Симпатии:
    0
    Применил. Ошибки нет. Что я делаю не так? ^_^
     
  11. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Ну и хорошо. Значит врубился в логику или звезды так встали ^_^
     
Загрузка...

Поделиться этой страницей