我在 VF 页面上遇到了一段 javascript 的问题,我希望有人能在代码存在缺陷的地方启发我。为了提供一个小的背景,VF 页面有一个选项列表和一个由 JS 读取/更新的输入字段。脚本中有 jquery 代码,通过从控制器(通过远程调用)检索可能匹配的列表来自动完成产品输入文本字段。为了缩小结果,我从 Line Type 选择列表中传入 pricebook Id 和 lineType。我试图让线型在 onchange 事件上执行代码,以便在用户在输入字段中键入结果之前“缓存”结果。到目前为止,在我的 soe 中,线型更改事件正在触发代码并基于警报,我可以看到控制器中的方法被调用并返回列表,
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;
}