我一直在尝试研究这个问题一段时间,我发现一个人有类似的问题,但他的问题没有解决方案:
https://github.com/twitter/typeahead.js/issues/1340
我的一些猎犬对象正在本地存储中产生预期的结果,但其中两个缺少数据(基准面)。即使他们缺少基准部分,其他一切都可以正常工作。我可以按预期使用提前键入进行搜索。我想知道为什么这两个对象没有存储数据。
我现在尝试使用 cacheKey 属性而不是默认值,因此此图像不会显示我使用 cacheKey 属性。
示例图像:本地存储
这是我使用提前键入的代码的一部分。预类型有效,但它未存储在本地存储中:
JavaScript:
var sections = new Bloodhound({
datumTokenizer: function (d) {
$(".loadingSections").hide();
var namepartTokens = Bloodhound.tokenizers.nonword(d);
var nameTokens = Bloodhound.tokenizers.whitespace(d);
var allTokens = namepartTokens.concat(nameTokens);
return allTokens;
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: {
url: classLookUp,
cacheKey: 'sectionLookUp'
}
});
sections.initialize();
$(".section-lookup .typeahead").typeahead({ highlight: true }, {
source: sections.ttAdapter()
});
.HTML
...
<script>
var classLookUp = '@Url.Action("GetClassNames", "Home")';
...
</script>
...
<div class="form-group section-lookup">
<div class="loadingSections"></div>
<label class="control-label col-sm-2">Section:</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.DisplayName, new { @class = "form-control typeahead", @id = "editLookup", @placeholder = "ex. 15/FA CIS-131-102" })
</div>
</div>
<button type="button" id="editSearch" class="btn btn-primary col-sm-offset-4 col-sm-4">Search for Course</button>
C#
[HttpGet]
public ActionResult GetClassNames()
{
try
{
var newSections = this.repo.Courses;
var names = newSections.Select(course => course.DisplayName).ToList();
return this.Json(names, JsonRequestBehavior.AllowGet);
}
catch (DatabaseConnectionException)
{
return this.Json(new { failure = true }, JsonRequestBehavior.AllowGet);
}
}
注意:我似乎离超过本地存储最大存储还很远
我终于发现了为什么它没有存储在本地存储中。原因是超出了本地存储的最大存储。我发现在存储的基准部分的末尾有一个 trie 属性,它与它一起存储。即使您的列表只有 3,000 个元素,附带的 trie 也足够大,可以占用大量存储空间。所以有未知的开销。
特里:好像是搜索的树。我想要一种仅存储基准部分并始终生成树客户端的方法。这样,我们可以在本地存储中存储更多内容。不将其作为默认值会破坏 prefech 的目的,即不调用服务器。我知道这棵树正在客户端构建,但我们不需要将其保存在本地存储中。