Value Picker get error TypeError: resp is null in XPages
Value Picker get error TypeError: resp is null in XPages
我不知道哪里出了问题,我在另一个页面上使用了几乎完全相同的代码。我让valuePitker从a viewScope.vsFieldNames获得其值,我知道它在单击值选择器之前填充了它,但是当“选择器”对话框显示时,我会得到错误
TypeError: resp is null
字段 reqOnSave 是一个多行编辑框,它为空,但我认为这不会有任何区别。我在其他几个页面中使用范围变量作为 valueList 没有问题。我确定我遗漏了一些简单的东西。
10 月 17 日编辑
我的页面如下所示:
当我单击 Select 字段时,我得到以下显示。我知道此时 viewScope.vsFieldNames 已正确填充,因为我使用调试工具栏对其进行了检查。
我真的不喜欢 xe:valuePicker,因为它会调用一个对话框,我更喜欢多 select 组合框之类的东西,但是没有标准的核心或扩展库控件可以这样做(至少我能找到)。
这是我的完整代码:
<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>
resp 是传递给选择器的客户端 JavaScript 变量,因此选择器没有加载任何选项。
ValuePicker 使用 ${javascript:viewScope.vsFieldNames;}
。因此,使用调试工具栏可见的事实可能会产生误导,因为调试工具栏显示 在 值已加载到 ValuePicker 后的输出。
要使用该代码,您需要在 beforePageLoad
事件中设置 viewScope.vsFieldNames
。要在代码为 运行 时仔细检查它是否为 null,请修改以在调用 viewScope.vsFieldNames
之前调试出内容,例如${javascript:print(viewScope.vsFieldNames); return viewScope.vsFieldNames;}
。很可能当它是 运行 时,该值尚未初始化。
如果你不能在beforePageLoad中设置它,为了解决这个问题,而不是${javascript:viewScope.vsFieldNames;}
(SSJS页面加载)使用#{viewScope.vsFieldNames}
(EL动态)。这应该有效,您将避免使用 SSJS 解析器,因此性能不会受到负面影响。
我不知道哪里出了问题,我在另一个页面上使用了几乎完全相同的代码。我让valuePitker从a viewScope.vsFieldNames获得其值,我知道它在单击值选择器之前填充了它,但是当“选择器”对话框显示时,我会得到错误
TypeError: resp is null
字段 reqOnSave 是一个多行编辑框,它为空,但我认为这不会有任何区别。我在其他几个页面中使用范围变量作为 valueList 没有问题。我确定我遗漏了一些简单的东西。
10 月 17 日编辑 我的页面如下所示:
当我单击 Select 字段时,我得到以下显示。我知道此时 viewScope.vsFieldNames 已正确填充,因为我使用调试工具栏对其进行了检查。
我真的不喜欢 xe:valuePicker,因为它会调用一个对话框,我更喜欢多 select 组合框之类的东西,但是没有标准的核心或扩展库控件可以这样做(至少我能找到)。
这是我的完整代码:
<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>
resp 是传递给选择器的客户端 JavaScript 变量,因此选择器没有加载任何选项。
ValuePicker 使用 ${javascript:viewScope.vsFieldNames;}
。因此,使用调试工具栏可见的事实可能会产生误导,因为调试工具栏显示 在 值已加载到 ValuePicker 后的输出。
要使用该代码,您需要在 beforePageLoad
事件中设置 viewScope.vsFieldNames
。要在代码为 运行 时仔细检查它是否为 null,请修改以在调用 viewScope.vsFieldNames
之前调试出内容,例如${javascript:print(viewScope.vsFieldNames); return viewScope.vsFieldNames;}
。很可能当它是 运行 时,该值尚未初始化。
如果你不能在beforePageLoad中设置它,为了解决这个问题,而不是${javascript:viewScope.vsFieldNames;}
(SSJS页面加载)使用#{viewScope.vsFieldNames}
(EL动态)。这应该有效,您将避免使用 SSJS 解析器,因此性能不会受到负面影响。