我有一个模板字符串。我已编译"它。现在我想针对一个对象运行它并检查结果。
但这不起作用:
var template = '<div>{{#each items}}<div>{{item}}</div>{{/each}}</div>';
var compiled = Ember.Handlebars.compile(template);
var result = compiled({ items: [1, 2, 3] }); // ERRORS
我想得到的是针对对象运行编译字符串的DOM结果。换句话说,一组看起来像这样的DOM元素:
<div>
<div>1</div>
<div>2</div>
<div>3</div>
</div>
似乎Ember.Handlebars.compile与Ember应用程序的其他部分紧密耦合,以至于它期望在我通过编译函数的上下文中填充很多东西。我还没有弄清楚所有这些是什么,或者是否有更好的方法来创建一个上下文来传递给已编译的函数。
答案 0 :(得分:3)
你为什么要这样做? ;)
老实说,最简单的方法是创建一个视图。由于数据绑定等问题,Ember在调用编译时会挂起一堆花哨的渲染内容,因此很难直接从编译函数创建它(它传递了一些额外的东西,比如缓冲区等等。 。)
var view = Ember.View.extend({
template:Ember.Handlebars.compile('hello <div>{{#each item in view.items}}<div>{{item}}</div>{{/each}}</div>')
});
var foo = view.create({ items: [1, 2, 3] });
foo.appendTo('#blah');
实施例
http://emberjs.jsbin.com/qeyenuyi/1/edit
// you must wait for all bindings to sync before you can check the contents of #blah:
var empty = $('#blah').html(); // this will be empty
Ember.run.next(function(){
var notEmpty = $('#blah').html(); // this will have the proper result in it
});
或者您可以连接到didInsertElement
回调
var foo = view.create(blah);
foo.didInsertElement = function(){
console.log(foo.$().html());
}
foo.appendTo('#blah');
http://emberjs.jsbin.com/qeyenuyi/6/edit
当您创建Ember车把模板时,绑定仍然有效,因此您可以修改传入的对象并更新模板。