如何获取句柄以在上下文上调用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()?
答
您可以使用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。
我看到旧Ember源代码中提到的功能,但是我不清楚他们是如何做到的。 https://github.com/emberjs/ember.js/blob/v1.9.1/packages/ember-handlebars-compiler/lib/main.js#L47 – btd
可能会尝试类似于“{{get this value}}''也许..但是,如果你想单独使用ember/handlebars,你可能有兴趣使用[Glimmer](https://glimmerjs.com/) – max
我可以使用get helper,但是,它感觉凌乱。获得帮手必须包括在我所有的胡须中。 – btd