我在VF页面上遇到一段javascript的问题,我希望有人可以告诉我代码存在缺陷的地方。为了给出一个小背景,VF页面有一个选择列表和一个由JS读取/更新的输入字段。脚本中有jquery代码,通过从控制器检索可能的匹配列表(通过远程调用)来自动完成Product输入文本字段。为了缩小结果的尺寸,我将传递价格手册Id和线型选项列表中的lineType。我试图让linetype执行onchange事件上的代码,以便在用户在输入字段中输入结果之前“缓存”结果。到目前为止,线型更改事件是触发代码并基于警报,我可以看到控制器中的方法被调用并返回列表,但结果有2个问题:
1).change事件不会多次触发,因此第一次改变选项列表值时,代码会触发并执行远程调用,但是对选项列表的任何后续更改都不会再次触发代码。这是为什么?当选择选项列表时,.change不应该总是触发吗?
2)自动填充并不是基于来自呼叫的重复建议的值,这意味着我没有看到弹出远程呼叫返回的建议。
以下是相关代码(VF页面,js和控制器方法)。请有人帮我一把!
VF + js代码:
<script>
var pop, prodNames, pbId, lineType, availableProds;
$j = jQuery.noConflict();
$j(function() {
$j("select[id$='fLineType']").change(function() {
pbId = $j("input[id$='pbid']").val();
lineType = $j(this).val();
alert('Line type selected' + $j(this).val() + ' - ' + pbId );
// call remote apex method and get chache list of Prod Names:
SalesDocumentManager_Controller.cacheProdNames(pbId, lineType,
function(result, event){
alert('Result from remote call: ' + result);
availableProds = result;
},
{escape: true}
);
});
$j("input[id$='prodName']").autocomplete({
source: availableProds,
minLength: 3
});
});
控制器远程方法(当前返回虚拟数据): //这似乎有效,因为它返回下面创建的值:
@RemoteAction
public static String[] cacheProdNames (String pbId, String lineType) {
system.debug('###remote action is executing');
String[] prodNames = new List<String>();
prodNames.add('testProd');
prodNames.add('testProd 2');
return prodNames;
}