Javascript 在Typeahead.js和Bloodhound.js v0.10中使用Knockout

Javascript 在Typeahead.js和Bloodhound.js v0.10中使用Knockout,javascript,knockout.js,typeahead.js,bloodhound,Javascript,Knockout.js,Typeahead.js,Bloodhound,我刚刚转换到使用Bloodhound.js和Typeahead.js与Knockout。我有几个问题- Typeahead未在建议列表中显示名称属性 我不知道如何更新要查询的集合 我现在正在“静态”添加新数据,但它应该仍然显示在结果集中,而不是 self.addNew = function () { self.someOptions.push(new Option(self.someOptions().length + 1, 'Johnnn')); } 我愿意接受任何可行的建议,因此

我刚刚转换到使用Bloodhound.js和Typeahead.js与Knockout。我有几个问题-

  • Typeahead未在建议列表中显示
    名称
    属性
  • 我不知道如何更新要查询的集合
  • 我现在正在“静态”添加新数据,但它应该仍然显示在结果集中,而不是

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

    我愿意接受任何可行的建议,因此如果不需要的话,我不会一直使用Bloodhound.js,但由于我的应用程序的性质,我无法删除作为可观察属性的属性,但在某个时候调用ko.toJS肯定是一种选择。

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

    HTML

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

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

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

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

    HTML

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

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

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