Bho*_*omi 5 handlebars.js ember.js
是否可以将Handlebars预编译代码反编译为Handlebars模板?
可能会转换这样的东西:
function program2(depth0, data) {
var buffer = '', stack1;
data.buffer.push('<div ');
......
data.buffer.push('</div></div>');
return buffer;
}
至
<div>{{name}}</div>
Run Code Online (Sandbox Code Playgroud)
不幸的是,目前没有内置的方法可以做到这一点.
一种解决方案是编写一个遍历已编译代码的函数,查找HTML被推送的位置,然后将该HTML重新组合在一起(本质上是对函数进行反向工程).
有一个缺点:编译的模板使用depth0变量来存储从模型/对象传入的内容.你可以看到它和其他对象作为参数传入,其中每个编译模板都被实例化,IE ::
App.Templates = function (Handlebars, depth0, helpers, partials, data) { ... }
Run Code Online (Sandbox Code Playgroud)
因此,您必须遵循每条HTML的呈现方式,并找到与它们作为stack变量推入的表达式相对应的变量名称.您需要获取所用变量的名称,以便可以在模板中添加每个Handlebars块的属性(即:){{myData}}以及使用的表达式(如果它是块表达式).
说我有一个简单的模板:
{{#if stuff}}
<div id="General" class="content-section">
<p>{{myData}}</p>
</div>
{{/if}}
Run Code Online (Sandbox Code Playgroud)
该depth0对象将包含stuff和myData.它们正在模板中使用(这不是一个工作示例,我编辑了一个模板来向您展示它的样子):
buffer += "\r\n\r\n<div id=\"General\" class=\"content-section\">\r\n"
+ escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.stuff)),
stack1 == null || stack1 === false ? stack1 : stack1.myData)),
typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
Run Code Online (Sandbox Code Playgroud)
希望这有点帮助 - 如果你想把工作放进去,肯定是可行的.
| 归档时间: |
|
| 查看次数: |
973 次 |
| 最近记录: |