我使用绑定到select2插件的输入框滚动我自己的预先实现。用户将输入手动电子邮件地址,然后通过针对电子邮件正则表达式的onchange事件进行验证,或者他们可以开始键入已绑定到其帐户的收件人的DisplayName。此列表将通过对控制器的ajax调用获取,然后控制器进行服务调用并检索数据,然后通过动态创建的列表项进行检索。如果用户单击或点击其中一个显示的DisplayNames,则该收件人将被添加到所选收件人列表中,并从该点开始显示在select2中。
typeahead和ajax调用正常工作,数据正在返回并正确显示;但是,我似乎无法将从inital ajax调用返回的对象作为参数传递给函数。如果我尝试传递原始值,我的控制台调试器出现'unexpected identifier'
错误;如果我尝试传递JSON.stringify(value)
,我得到'unexpected token ;.'
我总是可以通过传入收件人的ID属性来回退(这很好,当我尝试传递我遇到的复杂对象时困难)并重新重建该对象,但显然最好避免这种情况并避免再次进行服务调用。提前谢谢。
这是脚本:
$(document).ready(function () {
$("#selectedRecipientList").select2({ tags: null, tokenSeparators: [",", " "] });
$('.select2-input').keyup(function (e) {
var currentString = $('.select2-input').val();
$.ajax({
dataType: 'json',
url: '@Url.Action("RecipientTypeAhead", "RecipientManager")',
data: { query: currentString },
success: (function (data) {
$('#TypeAheadRecipientsList').empty();
$(data).each(function (index, value) {
$('#TypeAheadRecipientsList').append('<li onclick="AddRecipientFromPicker(' + JSON.stringify(value) + ')">' + value.DisplayName + '</li>');
});
})
});
});
});
function AddRecipientFromPicker(someData){} //only ever reaches here if int primitive is passed in
以下是在ajax方法中返回对象后的外观示例:{"AccountName":"abc","DisplayName":"abc","Email":"abc@test.net","Id":94654}
答案 0 :(得分:2)
你做不到:
$(data).each(function (index, value) {
$('#TypeAheadRecipientsList').append('<li onclick="AddRecipientFromPicker(' + JSON.stringify(value) + ')">' + value.DisplayName + '</li>');
});
因为data
不是dom元素。
尝试这样做:
for(var index in data) {
var value = data[index];
$('#TypeAheadRecipientsList').append('<li onclick="AddRecipientFromPicker(' + JSON.stringify(value) + ')">' + value.DisplayName + '</li>');
}
请尽量不要使用内联事件处理程序。
所以 将它们放在一起:
for(var index in data) {
var value = data[index];
var listItem = $('<li>' + value.DisplayName + '</li>');
listItem.data('value', JSON.stringify(value)).on('click', function(){
AddRecipientFromPicker($(this).data('value'));
});
$('#TypeAheadRecipientsList').append(listItem);
}