2016-09-05 1 views
9

Я ищу способ запуска различных методов для кнопок в предложениях типа head.Включить кнопки внутри предложения типа headhead с использованием Backbone

Typeahead suggestions

Я использую позвоночник снизу и я создал соответствующие события и методы, которые должны быть вызваны, однако, когда я нажимаю только машинописный по умолчанию: выбранное событие происходит, но не методы, которые я создал.

EDIT

Это соответствующий код для этого вида:

var QueryInputView = Backbone.View.extend({ 
el: $('#query-input'), 
initialize: function (options) { 
    _.bindAll(this, 'clearInput', 'initWordSuggester', 'initConceptSuggester', 'initTypeAhead'); 
    this.initTypeAhead(); 
}, 
events: { 
    'keyup': function (e) { 
     if (e.keyCode === 13) { 
      var value = this.$el.typeahead('val').trim(); 
      if (value !== '') { 
       kbmed.events.trigger('query-term:add', value); 
       this.clearInput(); 
      } 
     } 
    }, 
    'click .add': "addConceptMust", 
    'click .add-mustnot': "addConceptMustNot", 
    'click .add-should': "addConceptShould" 
}, 
addConceptMust: function (event) { 
    // Add concept to filter list 
    console.log('adding'); 
    var id = $(event.currentTarget).attr('id'); 
    var term = $(event.currentTarget).parent().prev().text(); 
    app.queryPanel.addQueryConceptMust({'conceptId': id, 'term': term}); 
}, 
addConceptMustNot: function (event) { 
    // Add concept to filter list 
    var id = $(event.currentTarget).attr('id'); 
    var term = $(event.currentTarget).parent().prev().text(); 
    app.queryPanel.addQueryConceptMustNot({'conceptId': id, 'term': term}); 
}, 
addConceptShould: function (event) { 
    // Add concept to filter list 
    var id = $(event.currentTarget).attr('id'); 
    var term = $(event.currentTarget).parent().prev().text(); 
    app.queryPanel.addQueryConceptShould({'conceptId': id, 'term': term}); 
}, 
clearInput: function() { 
    this.$el.typeahead('val', ''); 
}, 
initWordSuggester: function() { 
    var suggestWordsQuery = { 
     "text": "%QUERY", 
     "phraseSuggestions": { 
      "phrase": { 
       "field": "article.fulltext", 
       "max_errors": 1, 
       "gram_size": 3, 
       "direct_generator": [ 
        { 
         "field": "article.fulltext", 
         "suggest_mode": "popular", 
         "prefix_length": 2, 
         "min_doc_freq": 3 
        } 
       ] 
      } 
     } 
    }; 

    var engineWords = new Bloodhound({ 
     name: 'words', 
     datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), 
     queryTokenizer: Bloodhound.tokenizers.whitespace, 
     remote: { 
      url: 'http://' + kbmed.properties.es.hostAndPort + '/' + kbmed.properties.es.docIndex + '/_suggest?source=' + JSON.stringify(suggestWordsQuery), 
      filter: function (response) { 
       var suggestions = response.phraseSuggestions[0].options; 
       if (suggestions && suggestions.length > 0) { 
        return $.map(suggestions, function (suggestion) { 
         return { 
          value: suggestion.text 
         }; 
        }); 
       } else { 
        kbmed.log('Not suggestions'); 
        return {} 
       } 
      } 
     } 
    }); 
    engineWords.initialize(); 
    return engineWords; 
}, 
initConceptSuggester: function() { 
    var suggestConceptsQuery = { 
     "query": { 
      "query_string": { 
       "default_field": "term", 
       "query": "%QUERY" 
      } 
     }, 
     "suggest": { 
      "text": "%QUERY", 
      "completitionSuggestions": { 
       "completion": { 
        "field": "term_suggest" 
       } 
      } 
     } 
    }; 

    var engineConcepts = new Bloodhound({ 
     name: 'concepts', 
     datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), 
     queryTokenizer: Bloodhound.tokenizers.whitespace, 
     remote: { 
      url: 'http://' + kbmed.properties.es.hostAndPort + '/' + kbmed.properties.es.sugIndex + '/_search?source=' + JSON.stringify(suggestConceptsQuery), 
      filter: function (response) { 
       var completitionSuggestions = response.suggest.completitionSuggestions[0].options; 
       if (completitionSuggestions && completitionSuggestions.length > 0) { 
        return $.map(completitionSuggestions, function (suggestion) { 
         var concept = JSON.parse(suggestion.text); 
         return { 
          concept: concept, 
          value: concept.term 
         }; 
        }); 
       } else { 
        var hits = response.hits.hits; 
        if (hits && hits.length > 0) { 
         return $.map(hits, function (hit) { 
          var concept = hit._source; 
          return { 
           concept: concept, 
           value: concept.term 
          }; 
         }); 
        } else { 
         kbmed.log('Not suggestions'); 
         return {}; 
        } 
       } 
      } 
     } 
    }); 
    engineConcepts.initialize(); 
    return engineConcepts; 
}, 
initTypeAhead: function() { 
    var that = this; 
    this.$el.typeahead({ 
     minLength: 3, 
     highlight: true 
    }, 
      { 
       source: this.initWordSuggester().ttAdapter() 
      }, 
      { 
       source: this.initConceptSuggester().ttAdapter(), 
       templates: { 
        header: '<h4 class="concept-name">Concepts</h4>', 
        suggestion: function (data) { 
         var concept = data.concept; 
         return '<div id="' 
           + concept.id 
           + '" class="concept-suggestion" >' 
           + concept.term.substring(0, 45) 
           + '<a style="float: right; margin-left: 3px;" href="#" id="' + concept.id + '" class="btn btn-warning btn-xs add-should"><span class="glyphicon glyphicon-check"></span></a>' 
           + '<a style="float: right; margin-left: 3px;" href="#" id="' + concept.id + '" class="btn btn-danger btn-xs add-mustnot"><span class="glyphicon glyphicon-minus"></span></a>' 
           + '<a style="float: right; margin-left: 3px;" href="#" id="' + concept.id + '" class="btn btn-success btn-xs add"><span class="glyphicon glyphicon-plus"></span></a>' 
           + '<strong style="float: right; font-size: 8pt; color: #837F7F;">' 
           + concept.category.toUpperCase() 
           + '</strong>' 
           + '</div>'; 
        } 
       } 
      } 
    ).on('typeahead:selected', function (e, datum) { 
     console.log(e); 
     console.log(datum); 
     e.preventDefault(); 
     if (datum.concept) { 
      kbmed.events.trigger('query-concept:add', datum.concept); 
     } else { 
      kbmed.events.trigger('query-term:add', datum.value); 
     } 
     that.clearInput(); 
    }); 
} 

});

Что я могу сделать для этого?

+1

доля какой-то код ... –

+1

Пожалуйста, раздеться код к [минимальному и полному примеру] (http://stackoverflow.com/ help/mcve), а не весь ваш код. –

+0

Позвольте мне угадать, что keyup работает, но даже консольный журнал (например, addConceptMust не отображается? – BonifatiusK

ответ

1

Если вы хотите слушать слушателей в этом представлении, вам необходимо отобразить html с помощью этих кнопок в этом представлении.

Сейчас вы используете javascript для написания html. Я бы никогда не рекомендовал это. В вашем случае это означает, что представление не знает об этих элементах.

Чтобы решить эту проблему: используйте шаблон и отрисуйте его в методе render().

В приведенном выше примере я бы предоставил дополнительный вид для списка «Концепции». Этот новый вид может быть вызван этим представлением.

вот небольшой пример того, что я имею в виду:

var QueryView = Backbone.View.extend({ 
    el: $('#query-input'), 
    initialize: function (options) { 
     _.bindAll(this, 'clearInput', 'initWordSuggester', 'initConceptSuggester', 'initTypeAhead'); 
    }, 

    render: function() { 

    }, 

    events: { 
     'keyup': 'handleKeyup' 
    } 

    handleKeyup: function (e) { 
     //run new concepts list view 
     var conceptsView = new ConceptsListView('queryValue'); 
    } 

}); 

var ConceptsListView = Backbone.View.extend({ 
    el: '#conceptsList', 
    queryResults: {}, 
    initialize: function (options) { 
     //do your query here 
     this.queryResults = yourQuery(); 
     this.render(); 
    }, 
    render: function() { 
     //Load HTML from template with query results 
     //in this template the buttons are to be found 
     this.$el.html(template); 
    }, 
    events: { 
     'click .add': "addConceptMust", 
     'click .add-mustnot': "addConceptMustNot", 
     'click .add-should': "addConceptShould" 
    }, 

    addConceptMust: function (e) { 

    }, 
    addConceptMustNot: function (e) { 

    }, 
    addConceptShould: function (e) { 

    }, 

});