如何使用第二个变量过滤typeahead.js中的结果?

时间:2014-12-26 23:49:51

标签: javascript jquery typeahead.js twitter-typeahead bloodhound

我正在尝试使用Typeahead.js过滤结果。我目前可以使用名为activity_title的字段过滤结果。这很好。

如何按第二个值过滤结果?在这种情况下,我只想选择具有activity_level特定值的结果。我需要在初始化typeahead时设置它,而不是将其硬编码到Bloodhound初始化中(例如,我不想使用url: 'api/activity/&range=1,3'

我有以下有效的JSON,我可以远程访问:

{
"meta": [
    {
        "name": "activity_id",
        "table": "table",
        "max_length": 4
    },
    {
        "name": "activity_title",
        "table": "table",
        "max_length": 91
    },
    {
        "name": "activity_level",
        "table": "table",
        "max_length": 2
    }
],
"detail": [
    {
        "activity_id": "57",
        "activity_title": "Help old ladies to cross the road.",
        "activity_level": "2"
    },
    {
        "activity_id": "58",
        "activity_title": "Help mum with the washing up.",
        "activity_level": "3"
    },
    {
        "activity_id": "59",
        "activity_title": "Shine my shoes",
        "activity_level": "1"
    },
    {
        "activity_id": "60",
        "activity_title": "Put the bins out",
        "activity_level": "1"
    }
]
}

我设置了一个像这样的Bloodhound实例:

var activities = new Bloodhound({
   datumTokenizer: function (datum) {
       return Bloodhound.tokenizers.whitespace(datum.activity_title);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: {
    url: '/api/activity/',
    filter: function(data) {
    return $.map(data['detail'], function(detail) {
        return {
            activity_id: detail.activity_id,
            activity_title: detail.activity_title,
            objective_level: detail.objective_level
        }; 
     });
   }
  }
});

我在输入时使用Typeahead.js对数据进行查找。

$( document ).on( "focus", ".typeahead-init", function() {

// + '&range=' + minimum + ',' + maximum
var minimum = $('#group-level-min-1').val();
var maximum = $('#group-level-max-1').val();

$(this).typeahead({
  highlight: true
},
{
  name: 'activity_title',
  displayKey: 'activity',
  source: activities.ttAdapter(),
  templates: {
    header: '<div class="header-name">Activities</div>',
    empty: [
      '<div class="empty-message">',
      'No activities match your search',
      '</div>'
    ].join('\n'),
    suggestion: Handlebars.compile('<div class="typeahead-activity" id="typeahead-activity-{{activity_id}}"><strong>{{objective_level}}</strong> - {{activity_title}}</div>')
  }
})
//info on binding selection at https://github.com/twitter/typeahead.js/issues/300
.bind('typeahead:selected', function(obj, datum, name) {      
    var target = $(this).closest('.activity-container');

        var activityId = datum['activity_id'];
        var url = '/api/activity/id/'+activityId;
        $(target).children('.activity-id').val(activityId);

        //http://runnable.com/UllA9u8MD5wiAACj/how-to-combine-json-with-handlebars-js-for-javascript-ajax-and-jquery
        var raw_template = $('#activity-output').html();
          // Compile that into an handlebars template
          var template = Handlebars.compile(raw_template);
          // Fetch all data from server in JSON
          $.get(url,function(data,status,xhr){
            $.each(data,function(index,element){
              // Generate the HTML for each post
              var html = template(element);
              // Render the posts into the page
              target.append(html);
            });
          });

});
$(this).removeClass("typeahead-init");
$(this).focus();
});

这是从Stackoverflow和其他人的几个答案拼凑而成的。非常感谢任何帮助。

0 个答案:

没有答案