1

我刚刚转换为使用带有 Knockout 的 Bloodhound.js 和 Typeahead.js。我有几个问题-

  1. Typeahead 未Name在建议列表中显示该属性
  2. 我不知道如何更新要查询的集合

http://jsfiddle.net/Ea93f/2/

我现在正在“静态”添加新数据,但它仍应显示在结果集中,而不是

self.addNew = function () {
    self.someOptions.push(new Option(self.someOptions().length + 1, 'Johnnn'));
}

我愿意接受任何可行的建议,所以如果不需要的话,我不会坚持使用 Bloodhound.js,但由于我的应用程序的性质,我无法将属性删除为 observables,但在某些时候调用 ko.toJS 是绝对是一个选择。

4

1 回答 1

9

第一个问题是 displayKey。您需要在绑定中提供显式函数

HTML

<input type="text" data-bind="typeahead: { name: 'something', taOptions: theseOptions, displayKey: 'Name' }, value: thisValue" />

Javascript

    // In ko.bindingHandlers.typeahead.init function
    var displayKey = options.displayKey;
    options.displayKey = function(item) {
        return item[displayKey]();
    };

第二个问题是使用本地。看起来系统在初始化后没有重新计算源。查看文档,您可能需要使用远程选项并假装是 ajax 请求/响应。您还需要实现自己的结果过滤器,以及在更新选项时绕过任一 requestCache。

我已经用以下内容更新了您的jsFiddle ...

self.theseOptions = new Bloodhound({
  datumTokenizer: function(d) { 
      var seomth = Bloodhound.tokenizers.whitespace(d.Name());
      console.log(seomth);
      return seomth },
  queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote : {
        url : '%QUERY',
        transport : function(url, options, onSuccess, onError) {
            var deferred = $.Deferred();
            deferred.done( function() { onSuccess(this); });

            var filterVal = url.toLowerCase();
            var result = self.someOptions().filter( function(item) {
                return !!~item.Name().toLowerCase().indexOf(filterVal);
            });
            deferred.resolveWith( result );
            return deferred.promise();
        }

    }
  //local: self.someOptions()
});

self.addNew = function () {
    self.someOptions.push(new Option(self.someOptions().length + 1, 'Johnnn'));
    self.theseOptions.transport.constructor.resetCache();
}
于 2014-02-27T03:16:05.533 回答