我一直在尝试研究这个问题,我找到了一个有类似问题的人,但他的问题没有解决方案:
https://github.com/twitter/typeahead.js/issues/1340
我的一些猎犬对象正在将预期结果产生到本地存储中,但其中两个缺少数据(基准)。即使他们缺少基准部分,其他一切都有效。我可以按预期搜索预先输入。我想知道为什么这两个对象没有存储数据。
我现在尝试使用cacheKey属性而不是默认值,因此该图像不会显示我使用cacheKey属性。
以下是我使用typeahead的代码的一部分。预先输入有效,但它没有存储在本地存储中:
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()
});
...
<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>
[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);
}
}
注意:我似乎远离超过localstorage max storage
答案 0 :(得分:0)
我终于找到了为什么它没有存储在本地存储中。原因是超出本地存储最大存储空间。我发现在存储的基准部分的末尾有一个trie属性,它与它一起存储。即使你的列表只有3,000个元素,附带的trie足够大,可以占用大量的存储空间。所以有未知的开销。
trie:它似乎是搜索的树。我想要一种方法来只存储基准部分,并让树始终生成客户端。这样我们就可以在本地存储上存储更多内容。没有这个作为默认设置会破坏预设的目的,即没有调用服务器。我知道树正在构建客户端,但我们不需要将它保存在本地存储中。