把手 - 反编译把手编译代码到车把模板

时间:2014-07-03 05:45:18

标签: ember.js handlebars.js

是否可以将Handlebars预编译代码反编译为Handlebars模板?

可能会转换这样的内容:

function program2(depth0, data) { var buffer = '', stack1; data.buffer.push('<div '); ...... data.buffer.push('</div></div>'); return buffer; }

<div>{{name}}</div>

1 个答案:

答案 0 :(得分:6)

不幸的是,目前没有内置的方法可以做到这一点。

一个解决方案是编写一个遍历已编译代码的函数,查找推送HTML的位置,然后将该HTML重新组合在一起(从根本上对函数进行反向工程)。

有一个缺点:编译的模板使用depth0变量来存储从模型/对象传入的内容。你可以看到它和其他对象作为参数传入,其中每个编译模板都被实例化,IE ::

App.Templates = function (Handlebars, depth0, helpers, partials, data) { ... }

因此,您必须了解每个HTML的呈现方式,并找到与作为stack变量推送的表达式对应的变量名称。您需要获取所用变量的名称,以便您可以在模板中添加每个Handlebars块的属性(即:{{myData}})以及使用的表达式(如果它是块表达式)

说我有一个简单的模板:

{{#if stuff}}
    <div id="General" class="content-section">
    <p>{{myData}}</p>
    </div>
{{/if}}

depth0对象将包含stuffmyData。它们正在模板内部使用(这不是一个有效的例子,我编辑了一个模板来向你展示它的样子):

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))

希望这有点帮助 - 如果你想把工作放进去,肯定是可行的。

相关问题