我需要对非常大的数据使用typeahead。生成数据需要 4-5 秒。所以我不能每次都打Ajax电话。我根据用户要求下载并缓存数据。我的代码如下:
$("#build-package-list-btn").click(function(){
$.get**JSON**("/packages", function(data){
// data is an array
$("#typeahead-packages").typeahead({source:data});
console.log(data == null); // returns false
});
})
它没有给出错误,但是每当我尝试写入预先输入文本框时,它都会给我以下错误:
Uncaught TypeError: Cannot call method 'toLowerCase' of null bootstrap.js:1644
Typeahead.matcher bootstrap.js:1644
(anonymous function) bootstrap.js:1631
e.extend.grep jquery-1.7.2.min.js:2
Typeahead.lookup bootstrap.js:1630
Typeahead.keyup bootstrap.js:1738
e.extend.proxy.g jquery-1.7.2.min.js:2
f.event.dispatch jquery-1.7.2.min.js:3
f.event.add.h.handle.i jquery-1.7.2.min.js:3
我的打字是这样的(翡翠)
input#typeahead-packages(type="text",data-provide="typeahead")
同样在Chrome控制台中,我尝试了:
$("#typeahead-packages").typeahead({source:["abcdef","abcddd","abcccc"]});
但是提前输入不会给出错误,但它也不起作用。我找不到我做错了什么。我正在使用 2.0.4 引导程序。
编辑:我将其更改为getJSON,从获取它没有帮助。但是,当我构建这样的数据时,它正在工作:
data = [new String((data[0])), new String((data[5]))];
根据您的更新,问题来自 JSON。
jQuery.getJSON()
重要提示:从 jQuery 1.4 开始,如果 JSON 文件包含语法错误,请求通常会以静默方式失败。(来源)
您应该专注于项目的来源。 确保这是一个字符串数组。您的错误表明data
是一个字符串。
您可以使用 Chrome 控制台(或您选择的任何控制台)在"网络"选项卡下,并监视 AJAX 请求的实际结果。JSONLint 是一个有趣的工具来验证您的结果。
然后,您的下一个问题将是更新已初始化的 typeahead 的源代码。您可以使用以下代码:
var $myTypeahead = $('#myTypeahead');
var typeaheadObj = $myTypeahead.data('typeahead');
if(typeaheadObj) typeaheadObj.source = ["abc", "cde"];
示例(jsfiddle)