我一直在评估许多不同的客户端JS模板引擎(doT,parrot,dust.js,microtemplating,下划线等)。它们都是类似的,使用某种类型的标签来表示数据,并且有些能够将纯JS嵌入到模板中,包括循环,if / then等。但是,它们都通过将模板本身转换为字符串来工作,然后进入javascript,以插入变量,执行循环等。
当发生这种转换时,附加到模板中原始对象的任何事件处理程序(即由document.ready中的jQuery创建)当然都会丢失。要将这些处理程序添加回生成的HTML,则需要在每次模板渲染后返回并重新应用任何此类事件处理程序。
我试图想办法创建一个具有完整javascript支持的模板引擎,但在克隆之前保留附加到模板的任何事件。
想象一下模板用于项目列表的场景。每个项目都包含对该项目执行特定任务的按钮(即编辑,删除,重命名,复制,您可以获得该想法)。
为了使代码清晰且易于维护,将click事件应用于document.ready()模板HTML中的这些按钮是有意义的。然后,每次克隆模板以获取新的列表项时,也会克隆事件。
但是,对于当前模板库,所有事件在克隆阶段都会丢失,这样每次列表更新时都需要将所有事件应用于克隆对象。如果这是实时数据,或者用户正在向列表中添加新项目,那么在每次添加项目时,跟踪事件并确保它们被正确附加似乎会变得非常复杂。
我知道jQuery有一个克隆事件的clone()函数,这对基本模板非常有用,但是当你尝试将任意javascript合并到模板中时,这就变得不切实际了。
我正在尝试避免依赖于html元素属性的模板来配置循环,决策等,因为模板代码变得非常难看。需要一个干净的模板,其中包含用于数据替换的简单标记,用于重复元素的简单JS for循环以及对源数据的简单引用。
任何人都有关于如何做到这一点的想法?
谢谢!
答案 0 :(得分:2)
您应该使用事件委派,而不是使模板过于复杂,以免此问题出现。
是的,jQuery 有 .delegate
- 它已被弃用,并已被.on
取代,它可以做同样的事情,请参阅http://api.jquery.com/delegate/#entry-longdesc < / p>