【问题标题】:Using Knockout with Typeahead.js and Bloodhound.js v0.10将 Knockout 与 Typeahead.js 和 Bloodhound.js v0.10 一起使用
【发布时间】:2014-02-26 23:28:17
【问题描述】:

我刚刚转换为将 Bloodhound.js 和 Typeahead.js 与 Knockout 一起使用。我有一些问题 -

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

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

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

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

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

【问题讨论】:

    标签: javascript knockout.js typeahead.js bloodhound


    【解决方案1】:

    第一个问题是 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();
    }
    

    【讨论】:

      最近更新 更多