我正在使用typeahead.js,这是代码:
<script>
$(function () {
var projectNumbers;
$.getJSON("api/Project/GetAllNumbers")
.done(function (result) {
console.log(result);
projectNumbers = result;
})
.fail(function (jqXHR, textStatus, err) {
alert('Error: ' + err);
});
var substringMatcher = function (strs) {
return function findMatches(q, cb) {
var matches, substrRegex;
console.log(strs); // Undefined
console.log(projectNumbers); //Filled
// an array that will be populated with substring matches
matches = [];
// regex used to determine if a string contains the substring `q`
substrRegex = new RegExp(q, 'i');
// iterate through the pool of strings and for any string that
// contains the substring `q`, add it to the `matches` array
$.each(strs, function (i, str) {
if (substrRegex.test(str)) {
// the typeahead jQuery plugin expects suggestions to a
// JavaScript object, refer to typeahead docs for more info
matches.push({ value: str });
}
});
cb(matches);
};
};
$('#jobNumber').typeahead({
hint: true,
minLength: 3,
highlight: true,
},
{
name: 'projects',
source: substringMatcher(projectNumbers),
});
});
</script>
如果查看substringMatcher函数,则参数strs未定义。我将它传递到typeahead源的底部。 projectNumbers当我将数据传递给函数时,有数据,即使我将其记录到控制台,它也有数据。但是未定义。
任何建议?
更新
当我加载页面时,我正在记录getJSON的返回并填充它(第7行)。如果这是填充的,那么当我将其作为参数传递时,为什么它不会填充?
答案 0 :(得分:0)
这是因为你的代码是异步的。在您的其余代码之后执行getJSON done()
。所以当你执行
source: substringMatcher(projectNumbers)
projectNumbers
可能尚未初始化。但是当您调用由substringMatcher(projectNumbers)
创建的函数时,projectNumbers
会被初始化。这就是你得到的原因:
console.log(strs); // Undefined
console.log(projectNumbers); //Filled