我的某些搜索结果在本地存储中没有数据

Some of my search results don't have datums in local storage

我一直在努力研究这个问题,我发现一个人有类似的问题,但没有解决他的问题:

https://github.com/twitter/typeahead.js/issues/1340

我的一些 bloodhound 对象在本地存储中产生了预期的结果,但是其中两个对象缺少 data(基准)。即使他们缺少基准部分,其他一切都有效。我可以按预期使用 type-ahead 进行搜索。我想知道为什么这两个对象没有存储数据。

我现在尝试使用 cacheKey 属性而不是默认属性,所以这张图片不会显示我使用 cacheKey 属性。

Sample Image : Local Storage

这是我使用预输入的代码的一部分。 typeahead 有效,但它没有存储在本地存储中:

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

注意:我好像离超过localstorage max storage还很远

我终于找到了为什么它没有存储在本地存储中。原因是超出了本地存储的最大存储空间。我发现在存储的数据部分的末尾有一个与它一起存储的 trie 属性。即使您的列表只有 3,000 个元素,它附带的 trie 也足以占用大量存储空间 space。所以有未知的开销。

trie:好像是搜索树。我想要一种仅存储基准部分并始终在客户端生成树的方法。这样我们就可以在本地存储上存储更多的东西。不将其作为默认值会破坏预加载的目的,即不调用服务器。我知道树正在客户端构建,但我们不需要将其保存在本地存储中。