XPages getComponent() не работает правильно
У меня есть XPage, который использует диалог JQuery и клиентскую проверку для проверки ввода, который обрабатывает пользователь. Проблема в том, что когда я нажимаю кнопку Добавить, проверка на стороне клиента работает, но свойства из этих полей "не могут быть найдены" на стороне сервера. Когда пользователь нажимает кнопку "Открыть диалоговое окно", появляется диалоговое окно, и вот моя кнопка, где происходит волшебство (например, только одно свойство):
<xp:button id="save_part_btn" value="+Add" style="float:right;">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:
/*
var estdoc:NotesDocument=database.getDocumentByUNID(doc_source.getDocument().getParentDocumentUNID())
var estPartdoc:NotesDocument=estdoc.getParentDatabase().createDocument()
Ignore it
estPartdoc.replaceItemValue('Form','Estimate_Cost_Part')
estPartdoc.replaceItemValue('Predoc',estdoc.getUniversalID())
estPartdoc.replaceItemValue('$OSN_IsSaved','1')
*/
estPartdoc.replaceItemValue('TSNB_All',getComponent('input_tsnb_all').getValue())
}]]></xp:this.action>
<xp:this.script><![CDATA[
var isValid = true;
var result = "";
function isStringEmpty(string2Check)
{
return string2Check == "" || string2Check[0] == " ";
}
function isNumberCorrect(number2Check)
{
return /^[1-9]\d*(,\d{1,3})?$/.test(number2Check.toString());
}
if(isStringEmpty(document.getElementById("#{id:input_tsnb_all}").value))
{
wholeValid = false;
result += '-The field cannot be empty\n'
}
else if(!isNumberCorrect(document.getElementById("#{id:input_tsnb_all}").value))
{
wholeValid = false;
result += '-The field is not correct\n'
}
if(!isValid)
alert(result)
return isValid;
]]></xp:this.script>
</xp:eventHandler>
</xp:button>
Проверка на стороне клиента работает отлично - когда ввод пользователя неверен alert
сообщение отображается Тем не мение, input_tsbn_all
не может быть найден на стороне сервера, и документ с этим свойством не может быть создан. На самом деле это так, но значение input_tsbn_all в null
, В чем проблема?
Надбавка к недвижимости:
<xp:tr>
<xp:td><xp:label value="All:"/></xp:td>
<xp:td>
<xp:inputText id="input_tsnb_all"
disableClientSideValidation="true"
styleClass="doc_field_textinput" size="40" >
<xp:this.converter>
<xp:convertNumber pattern="0.000"></xp:convertNumber>
</xp:this.converter>
</xp:inputText>
</xp:td>
</xp:tr>
Мой код JQuery:
var dialogAddPartDiv = $('.dialogAddPart');
$('.addButton').click(function()
{
dialogAddPartDiv.dialog('open');
});
dialogAddPartDiv.dialog(
{
create: function (event, ui) {
$(".ui-corner-all").css('border-bottom-right-radius','8px');
$(".ui-corner-all").css('border-bottom-left-radius','8px');
$(".ui-corner-all").css('border-top-right-radius','8px');
$(".ui-corner-all").css('border-top-left-radius','8px');
$(".ui-dialog").css('border-bottom-left-radius','0px');
$(".ui-dialog").css('border-bottom-right-radius','0px');
$(".ui-dialog").css('border-top-left-radius','0px');
$(".ui-dialog").css('border-top-right-radius','0px');
$('.ui-dialog-titlebar-close').css('margin', '-25px -20px 0px 0px').css('border', 'solid 2px').css('border-radius', '15px').css('border-color', '#05788d');
$('.ui-dialog-titlebar-close').css('width', '25px').css('height', '25px');
},
autoOpen: false,
modal: true,
beforeClose : function(event)
{
if(!confirm("This won't be saved. Continue?"))
{
return false;
}
else
{
}
},
width:600,
resizable: false
});
document.getElementsByClassName('ui-dialog-titlebar-close')[0].setAttribute('title', 'Close it?');
И скрытый div только что объявлен на странице следующим образом: <xp:div styleClass="dialogAddPart">
1 ответ
Вам необходимо привязать свой ввод к свойству объекта, которое сохраняется через запрос. Глупым примером может быть использование viewScope
объект, который является картой.
<xp:inputText id="input_tsnb_all" value="#{viewScope.myInput}">
...
То, что вы позже сделаете в коде, будет искать viewScope.myInput
переменная, чтобы сделать то, что вы хотите с ним, а не найти компонент в ViewRoot
дерево.
Мой лучший совет для вас - побудить вас создать некоторые базовые принципы JSF, чтобы понять, почему так происходит.
Увы, XPages делает это для наихудшей возможной итерации JSF, где нужно учить вещи правильным образом. Большинство из них выдвигает основную концепцию - старое мышление разработчика Notes - которая мешает вам работать с фреймворком так, как он предназначен, то есть с MVC.
Я не собираюсь говорить вам избегать этого, потому что многое из того, что вы видите в Интернете по этой теме, - это старомодный суп. Но если вам не безразлично, возьмите не слишком новую книгу JSF и учитесь там. Или, бесплатно, вы можете посмотреть здесь. Конечно, вам нужно будет связать прочитанное с тем, что на самом деле доступно в XPages, поскольку, как мне грустно, XPages - это интерпретация JSF сама по себе.