使用Hogan迁移到Typeahead 0.10+

时间:2014-07-13 22:38:36

标签: javascript template-engine typeahead.js hogan.js twitter-typeahead

我一直在使用Typeahead 0.9.3和Hogan 2一段时间,而且设置非常简单。

在0.9.3我做了类似的事情:

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

根据Migration Guide to 0.10&#34;预编译的模板现在是必需的&#34;,所以在0.10.3我尝试:

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

但它不起作用。我收到错误:Uncaught TypeError: object is not a function

如果有另一个极简主义的模板引擎可以工作,我也会考虑它,但它必须很小。我不想添加像Handlebars这样的大文件或像Underscore这样的整个库。

任何想法? TIA!

1 个答案:

答案 0 :(得分:9)

正如Jake Harding所说,the solution for modern browsers是这样的:

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

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

不幸的是,Function.prototype.bind() is not supported by IE < 9,所以如果您需要支持无效的旧浏览器。

好消息是as stated by Steve Pavarno您不再需要模板引擎了。您可以通过传递如下函数来实现所需的结果:

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