如何在handlers.js模板中使用getters

How to use getters in handlebars.js templates?

本文关键字:getters handlers js      更新时间:2023-09-26

我正试图让我的handlers.js模板做这样的事情:

<li>{{ user.get('firstName') }} {{ user.get('lastName') }}</li>   

显然,这是行不通的。handlers.js有任何语法可以像上面那样直接使用getter吗?

谢谢。

<li>{{user.firstName}} {{user.lastName}}</li>

尽管如果它在循环中(来自<li>的假设),它应该是{{this.firstname}}

这是在车把中工作的,基本上是一个助手,然后使用{{get-book"title"}}:

Handlebars.registerHelper('get', function(model, attributeName) 
{
    return model.get(attributeName); 
});
var templateStr = '<div class="book-title">{{get preferredBook "title"}}</div>'; 
var Book = Backbone.Model.extend({});
var b = new Book({title: 'Lord of the rings'});
var context = {
    preferredBook: b
}; 
var template = Handlebars.compile(templateStr);
var output = template(context);
expect(output).toBe('<div class="book-title">Lord of the rings</div>');

更好,但需要时间来定制handlebas编译器。以下代码需要添加到用于编译模板的脚本中,而不是在运行时。将此代码添加到编译代码中,而不是添加到运行时中(这不是助手)。然后,您只需编写{{model.title}},编译器就会自动将该表达式转换为model.get('title')。当然,如果"model"不是Backbone.model,那么它将像往常一样访问json属性。

Handlebars.JavaScriptCompiler.prototype.nameLookup = function(parent, name)
{
    var result = '((typeof(Backbone)!="undefined" && ' + parent + ' instanceof Backbone.Model) ? ' + parent + '.get("' + name + '") : ' + parent;
    if (/^[0-9]+$/.test(name))
    {
        return result + '[' + name + '])';
    }
    else if (Handlebars.JavaScriptCompiler.isValidJavaScriptVariableName(name))
    {
        return result + '.' + name + ')';
    }
    else
    {
        return result + '[''' + name + '''])';
    }
};