最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

javascript - Migrating to Typeahead 0.10+ with Hogan - Stack Overflow

matteradmin5PV0评论

I have been using Typeahead 0.9.3 with Hogan 2 for a while and it was very straight forward to setup.

in 0.9.3 I did something like:

$('input.search-query').typeahead([
     {
         name:     "pages"
        ,local:    localSuggestions
        ,template: '<div class="tt-suggest-page">{{value}}</div>'
        ,engine:   Hogan
    }
]);

According to the Migration Guide to 0.10 "Prepiled Templates are Now Required", so in 0.10.3 I'm trying:

$('input.search-query').typeahead(null, {
     name:     "pages"
    ,source:   taSourceLocal.ttAdapter()
    ,templates: {
         suggestion: Hoganpile('<div class="tt-suggest-page">{{value}}</div>')
     }
});

but it does not work. I get an error: Uncaught TypeError: object is not a function

If there is another, minimalist template engine that can work I will consider it as well, but it has to be small. I don't want to add a huge file like Handlebars or a whole library like Underscore.

any ideas? TIA!

I have been using Typeahead 0.9.3 with Hogan 2 for a while and it was very straight forward to setup.

in 0.9.3 I did something like:

$('input.search-query').typeahead([
     {
         name:     "pages"
        ,local:    localSuggestions
        ,template: '<div class="tt-suggest-page">{{value}}</div>'
        ,engine:   Hogan
    }
]);

According to the Migration Guide to 0.10 "Prepiled Templates are Now Required", so in 0.10.3 I'm trying:

$('input.search-query').typeahead(null, {
     name:     "pages"
    ,source:   taSourceLocal.ttAdapter()
    ,templates: {
         suggestion: Hogan.pile('<div class="tt-suggest-page">{{value}}</div>')
     }
});

but it does not work. I get an error: Uncaught TypeError: object is not a function

If there is another, minimalist template engine that can work I will consider it as well, but it has to be small. I don't want to add a huge file like Handlebars or a whole library like Underscore.

any ideas? TIA!

Share Improve this question edited Jul 13, 2014 at 23:25 isapir asked Jul 13, 2014 at 22:38 isapirisapir 23.8k16 gold badges125 silver badges121 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 10

As stated by Jake Harding, the solution for modern browsers is like so:

var piledTemplate = Hogan.pile('<div class="tt-suggest-page">{{value}}</div>');

$('input.search-query').typeahead(null, {
    // ...
    templates: {
        suggestion: piledTemplate.render.bind(piledTemplate);
    }
});

Unfortunately, Function.prototype.bind() is not supported by IE < 9, so if you need to support older browsers that will not work.

The good news is that as stated by Steve Pavarno you don't need a template engine anymore. You can achieve the desired result by passing a function like so:

    // ...
    templates: {
        suggestion: function(data) { // data is an object as returned by suggestion engine
            return '<div class="tt-suggest-page">' + data.value + '</div>';
        };
    }
Post a comment

comment list (0)

  1. No comments so far