带有 Bloodhound 的 Twitter typeahead 不会刷新带有 Knockout 绑定的列表

Twitter typeahead with Bloodhound doesn't refresh list with Knockout binding

这可能是一个棘手的问题 - 我正在尝试将 Twitter typeahead 与 Bloodhound 引擎和自定义 Knockout 绑定结合使用。在我的示例中,我有两个运动员列表(橄榄球和英式足球)。我正在使用预先输入 select 一个列表中的运动员,我正在使用下拉列表 select 从哪个列表中拉出。

从下拉列表中 select 编辑一项运动后,Bloodhound 引擎将使用适当的运动员进行初始化,并创建预输入。当这项运动发生变化时,将使用新的运动员列表创建一个新的 Bloodhound 引擎。 问题 是 typeahead 仍在使用第一个运动员列表而不是新列表。

我已经调试过了,我知道 Bloodhound 引擎会使用新列表重新创建,然后 Twitter typeahead 会获得更新后的源代码。但是,可惜的是,旧列表在使用时出现了。我提交此 fiddle 作为证据 - 别管风格,它 正在进行的工作。简单解释一下代码:

顶部是 AthleteTypeahead class,自定义 athleteTypeahead 绑定(紧跟在 class 之后)创建用于初始化建议引擎和预输入。底部是我的视图模型,它创建了两个不同的运动员列表。为了调试和理智,我在视图中显示了 selected 运动员的完整列表,并在创建新的 Bloodhound 建议引擎时将列表发送到 console.log - 两个列表都正确更新。我在创建新引擎时尝试调用 clear()clearPrefetchCache(),即使它是一个全新的引擎,但也没有运气。想法?

$(element).typeahead('destroy') 添加到您的 AthleteTypeahead 构造函数中,即

var AthleteTypeahead = function(athletes, element) {
    $(element).typeahead('destroy');
    this.athletes = athletes;
    this.element = element;
};

您不能在已有的元素上创建新的提前输入,您必须处理掉第一个。您还可以在某处保存对 bloodhound 引擎的引用,并使用 clearadd 函数更新引擎,而无需销毁和重新初始化整个 typeahead。