Value Picker get error TypeError: resp равно NULL в XPages
Я не могу понять, где это происходит не так, у меня почти такой же код работает на другой странице. У меня есть valuePicker, получающий его значения из viewScope.vsFieldNames, и я знаю, что он заполняется до того, как я щелкаю на значке, но когда отображается диалоговое окно выбора, я получаю ошибку
Ошибка типа: соответственно ноль
поле reqOnSave представляет собой многострочное поле редактирования, и оно пустое, но я не думаю, что это должно иметь какое-либо значение. Я использовал переменную области видимости в качестве valueList на нескольких других страницах без проблем. Я уверен, что мне не хватает чего-то простого.
Отредактировано 17 октября. Моя страница выглядит так:
Когда я нажимаю на кнопку "Выбрать поля", я получаю изображение ниже. Я знаю, что viewScope.vsFieldNames правильно заполнен на этом этапе, потому что я проверяю его с помощью панели инструментов отладки.
Мне действительно не нравится xe: valuePicker, потому что он вызывает диалог, и я бы предпочел что-то вроде комбинированного списка с множественным выбором, но нет стандартного ядра или элемента управления Extension Library, который делает это (по крайней мере, я могу найти).
Вот мой полный код:
<div class="row">
<div class="col-sm-2">
<xp:label value="Application" id="label1"
for="ApplicationCombo">
</xp:label>
</div>
<div class="col-sm-4">
<xp:comboBox id="ApplicationCombo"
value="#{formDoc.Application}">
<xp:selectItems>
<xp:this.value><![CDATA[#{javascript:var rtn:Array = database.getView("vwWFSApplicationsEnabled").getColumnValues(0);
rtn.unshift("");}]]></xp:this.value>
</xp:selectItems>
<xp:eventHandler event="onchange" submit="true"
refreshMode="partial" refreshId="panelBody">
<xp:this.action>
<![CDATA[#{javascript:try{formDoc.replaceItemValue("FormName","");
}catch(e){
}}]]>
</xp:this.action>
</xp:eventHandler>
</xp:comboBox>
</div>
</div>
<xp:panel id="panelBody">
<xp:text escape="true" id="computedField1">
<xp:this.value><![CDATA[#{javascript:try{
var app:string = formDoc.getValue("Application");
var debug:Boolean = true;
if (debug) WFSUtils.sysOut("Application = " + app);
var form:String = formDoc.getValue("FormName");
if (debug) WFSUtils.sysOut("Form = " + form);
if (!(app == null || app == "")){
if ((!(form.substring(0,3) == "---")) && (!(form == null || form == ""))) {
if (debug) WFSUtils.sysOut("Form Name = " + form);
var thisForm:NotesForm = appProps[app].appDB.getForm(form);
if (debug) WFSUtils.sysOut("Got Form Name = " + thisForm.getName());
var rtn:Array = thisForm.getFields();
if (debug) WFSUtils.sysOut("Rtn = " + rtn.toString());
viewScope.vsFieldNames = rtn;
return null
}
}
viewScope.vsFieldNames = null;
return null
}catch(e){
WFSUtils.sysOut("Error in Get Fields " + e.toString());
viewScope.vsFieldNames = null;
return null;
}}]]></xp:this.value>
</xp:text>
<div class="row">
<div class="col-sm-2">
<xp:label value="Form Name :" id="label2"
for="FormCombo">
</xp:label>
</div>
<div class="col-sm-4">
<xp:comboBox id="comboBox1"
value="#{formDoc.FormName}">
<xp:selectItems>
<xp:this.value>
<![CDATA[#{javascript:var app:string = formDoc.getValue("Application");
if (!(app == null || app == "")){
var rtn = appProps[app].appDB.getView("vwWFSForms").getColumnValues(0);
rtn = sort_unique(rtn);
rtn.unshift("--- Select A Form ---");
return rtn
}else{
return null
}}]]>
</xp:this.value>
</xp:selectItems>
<xp:eventHandler event="onchange" submit="true"
refreshMode="partial" refreshId="panelBody">
</xp:eventHandler>
</xp:comboBox>
</div>
</div><!-- row Form -->
<div class="row">
<div class="col-sm-2">
<xp:label value="Required Fields On Save :" id="label3"
for="djComboReqOnSave">
</xp:label>
</div>
<div class="col-sm-4">
<xe:valuePicker id="pickerFields"
dialogTitle="Select One or More Fields" for="reqOnSave"
pickerText="Select Field/s :">
<xe:this.dataProvider>
<xe:simpleValuePicker caseInsensitive="false">
<xe:this.valueList><![CDATA[${javascript:viewScope.vsFieldNames;
}]]></xe:this.valueList>
</xe:simpleValuePicker>
</xe:this.dataProvider>
</xe:valuePicker>
</div>
<div class="col-sm-2">
<xp:inputTextarea id="reqOnSave"
value="#{formDoc.ReqOnSave}" multipleSeparator=",">
</xp:inputTextarea>
</div>
</div><!-- row reqOnSave -->
<div class="row">
</div>
</xp:panel>
1 ответ
resp - переменная клиентского JavaScript, переданная в средство выбора, поэтому в средство выбора не загружены никакие параметры.
ValuePicker использует ${javascript:viewScope.vsFieldNames;}
, Поэтому тот факт, что это видно с помощью панели инструментов отладки, может вводить в заблуждение, поскольку панель инструментов отладки показывает выходные данные после того, как значения были загружены в ValuePicker.
Чтобы использовать этот код, вам нужно настроить viewScope.vsFieldNames
в beforePageLoad
событие. Чтобы еще раз проверить, что во время выполнения кода он не равен нулю, внесите изменения, чтобы отладить содержимое перед вызовом viewScope.vsFieldNames
например, ${javascript:print(viewScope.vsFieldNames); return viewScope.vsFieldNames;}
, Скорее всего, когда он работает, значение еще не инициализировано.
Если вы не можете установить его в beforePageLoad, чтобы решить проблему, вместо ${javascript:viewScope.vsFieldNames;}
(Загрузка страницы SSJS) использовать #{viewScope.vsFieldNames}
(EL динамический). Это должно сработать, вы будете избегать синтаксического анализатора SSJS, поэтому производительность не пострадает отрицательно.