编译Ember模板字符串并以编程方式运行它,而不使用Ember应用程序?

时间:2014-06-17 22:07:52

标签: javascript ember.js handlebars.js

我只想对对象运行模板字符串并检查结果

我有一个模板字符串。我已编译"它。现在我想针对一个对象运行它并检查结果。

但这不起作用:

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应用程序的其他部分紧密耦合,以至于它期望在我通过编译函数的上下文中填充很多东西。我还没有弄清楚所有这些是什么,或者是否有更好的方法来创建一个上下文来传递给已编译的函数。

其他事项:

  • 我不想使用普通&#34;非Ember&#34;车把。
  • 如果可以,我想避免创建Ember应用程序。
  • 我真的不想回答有关&#34;为什么&#34;我想做这个。这就是我想要做的。 :P

1 个答案:

答案 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车把模板时,绑定仍然有效,因此您可以修改传入的对象并更新模板。

http://emberjs.jsbin.com/qeyenuyi/2/edit