如何获取句柄以在上下文上调用get()方法?

如何获取句柄以在上下文上调用get()方法?

问题描述:

我使用的是Ember Object自身的handlebars作为上下文。我希望它能像在Ember + HTMLBars中那样工作,它似乎调用get()而不是假设上下文是POJO。如何获取句柄以在上下文上调用get()方法?

var C = Ember.Object.extend({ 
    value: Ember.computed(function() { return "hello"; }) 
}); 
var template = Handlebars.compile("My ember object: {{value}}"); 
var str = template(C.create()); 

assert.equal(str, "My ember object: hello"); // Fails. str == "My ember object: [object Object]" 

有没有办法让handleBars调用get()?

+0

我看到旧Ember源代码中提到的功能,但是我不清楚他们是如何做到的。 https://github.com/emberjs/ember.js/blob/v1.9.1/packages/ember-handlebars-compiler/lib/main.js#L47 – btd

+0

可能会尝试类似于“{{get this value}}''也许..但是,如果你想单独使用ember/handlebars,你可能有兴趣使用[Glimmer](https://glimmerjs.com/) – max

+0

我可以使用get helper,但是,它感觉凌乱。获得帮手必须包括在我所有的胡须中。 – btd

您可以使用Handlebars Compiler API添加名称查找期间自动调用的帮助程序。

function MyCompiler() { 
    Handlebars.JavaScriptCompiler.apply(this, arguments); 
} 
MyCompiler.prototype = new Handlebars.JavaScriptCompiler(); 

MyCompiler.prototype.nameLookup = function(parent, name, type) { 
    if (type === 'context') { 
    return this.source.functionCall('helpers.get', '', [parent, JSON.stringify(name)]) 
    } else { 
    return Handlebars.JavaScriptCompiler.prototype.nameLookup.call(this, parent, name, type); 
    } 
} 

var env = Handlebars.create(); 
env.registerHelper('get', function(parent, name) { 
    return parent.get(name); 
}) 

env.JavaScriptCompiler = MyCompiler; 

现在问题中的原始示例有效。

var C = Ember.Object.extend({ 
    value: Ember.computed(function() { return "hello"; }) 
}); 
var template = env.compile("My ember object: {{value}}"); 
var str = template(C.create()); 

assert.equal(str, "My ember object: hello"); // PASS! 

此答案是基于this jsfiddle