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

rrr

Active member
03.03.2013
36
0
#1
Коллеги, подскажите, pls, в чем может быть дело. Пробую показывать/прятать элемент liMembers (типа listbox) в зависимости от содержимого элемента cbType (типа combobox). Если содержимое "Договор", то показывать. если нет, то прятать.

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

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

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

Код:
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: поместил оба элемента на одну панель, переключил обновление на частичное, только панели - перестало ругаться, но и работать не начало. Что еще может быть?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 570
263
#2
в трассировке, кот. отсут. и написано - что не так
 

rrr

Active member
03.03.2013
36
0
#3
Поместил элементы на панель и переключил форму на обновление только панели. Сообщение об ошибке пропало, но lbMembers все время виден. Может, еще что подскажете?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 805
21
#5
Как-то сложно все пишите/выдумываете.

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 компонента. Например так
Код:
var tmp = getComponent("inputText8").value
tmp == "Абонентский"
и обновлять его при помощи Partial refresh или Submit
 
A

alexas

#7
Код скрытия надо писать сразу в свойстве Visible компонента. Например так
var tmp = getComponent("inputText8").value
tmp == "Абонентский"
и обновлять его при помощи Partial refresh или Submit
И получить ошибку, если "inputText8" скрыт :)
Для SSJS, в коде скрытия (Visible компонента) удобно проверять Scope variable. Работает при полном и частичном обновлении.
Для CSJS, Visible компонента - Static и управлять видимостью:
document.getElementById("#{id:xxx}").style.display = "inline"
document.getElementById("#{id:xxx}").style.display = "none"
но это только при Partial Refresh компонента.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 805
21
#8
И получить ошибку, если "inputText8" скрыт ^_^
Для SSJS, в коде скрытия (Visible компонента) удобно проверять Scope variable. Работает при полном и частичном обновлении.
Для CSJS, Visible компонента - Static и управлять видимостью:
document.getElementById("#{id:xxx}").style.display = "inline"
document.getElementById("#{id:xxx}").style.display = "none"
но это только при Partial Refresh компонента.
Очень интересно. Видимое поле ссылается на невидимое... это как?
Всегда должен быть видимый набор полей, от которого "пляшут" дальше.

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. Сам потом с ума сойдешь, когда забудешь что и для чего писал
Или считаешь что большое количество кода показывает крутизну программиста?
 
A

alexas

#9
NickProstoNick конечно, если логика скрытия нескольких элементов одинакова, надо управлять всей группой. Я и не утверждал обратного.
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".
Вкурсе. А вот рабочий пример CSJS на скорую руку (примерно, о чем спрашивал rrr)
Код:
<?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 == "Абонентский"

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