传递来自ajax调用的对象时出现“Unexpected Identifier”

时间:2012-12-27 20:07:45

标签: javascript jquery

我使用绑定到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}

1 个答案:

答案 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);
}