Я использовал экран «@media only» в своем CSS, чтобы определить, как и какую информацию следует показывать в зависимости от размера экрана пользователя. У меня есть класс под названием panelContainer, который установлен для отображения, когда экран больше 767 пикселей, и класс под названием mobileContainer, который отображается, когда экран меньше этого.Настройка viewScope onLoad и onResize
У меня есть несколько настраиваемых элементов управления, один из которых содержит стандартный макет формы и другой, который содержит макет формы мобильного устройства. Первоначально я разместил div вокруг каждого с соответствующим styleClass. Проблема с этим была в том, что, хотя видима только одна форма, они оба загружены, поэтому это вызвало проблемы с сохранением.
<xp:div id="panelContainer" styleClass="panelContainer">
<xc:content_sCompany></xc:content_sCompany>
</xp:div>
<xp:div id="mobileContainer" styleClass="mobileContainer">
<xc:content_iCompany></xc:content_iCompany>
</xp:div>
С тех пор я добавил к моему DIV XPage с styleClass из panelContainer, я потом добавил OnLoad и OnResize события, которые возвращают style.display в DIV, они должны затем записать результат в viewScope. Но я обнаружил, что он будет писать только в onLoad, и хотя функция вызывается onResize, она не изменит переменную viewScope.
<xp:scriptBlock id="scriptBlock1" type="text/javascript">
<xp:this.value>
<![CDATA[var init = function() {
obj=document.getElementById('formType');
if(getStyleDisplay(obj)=="none"){
formType='#{javascript:viewScope.put("formFormat","mobile");}';
}else{
formType='#{javascript:viewScope.put("formFormat","standard")}';
}
}
dojo.addOnLoad(init);
dojo.connect(window,"onresize",init);
function getStyleDisplay(obj) {
if(obj.currentStyle) { // IE – Opera
return obj.currentStyle.display;
} else { // firefox
return getComputedStyle(obj,'').getPropertyValue('display');
}
}]]>
</xp:this.value>
</xp:scriptBlock>
<div id="formType" class="panelContainer"></div>
..... эта переменная viewScope затем используется следующим образом:
<xc:content_Company xp:key="ContentControl">
<xp:this.facets>
<xc:content_sCompany id="content_sCompany"
xp:key="standard">
</xc:content_sCompany>
<xc:content_iCompany id="content_iCompany"
xp:key="mobile">
</xc:content_iCompany>
</xp:this.facets>
</xc:content_Company>
..... экстракт из content_Company ......
<xp:callback facetName="#{viewScope.formFormat}" id="cbkCompanyFormContent">
</xp:callback>
Я чувствую, что это лучший способ добиться результата, который мне нужен, поскольку, когда я пробовал его вручную, он загружает только одну из форм и работает так, как ожидалось.
Не могу понять, почему viewScope не устанавливается должным образом, его всегда устанавливают на «стандарт», даже если я уменьшаю свою страницу перед загрузкой страницы. Я попытался записать значение в Hidden Input, который работал, но всякий раз, когда я пытался получить доступ к значению с помощью getComponent («hiddenInput1»). GetValue() возвратит значение null, хотя я мог видеть, что это значение было задано при просмотре в поджигатель.
Привет Саймон, я добавить предупреждения в течение всего процесс, и они срабатывали в соответствующих точках. Я думаю, что я просто слишком усложняю весь вопрос, пытаясь использовать onResize, в то время это была хорошая идея! Я посмотрю на страницу загрузки по умолчанию, как вы предлагаете. Большое спасибо –
, и вы частично обновили область, которая решала фасет на основе viewcope? так как это не изменило бы отображение без этого –
Нет, но сам viewScope никогда не менялся, так что не совсем так далеко. еще раз спасибо –