将 firefox 升级到 14.0.1 后,jquery.tmpl 开始显示“[object HTMLInputElement]”作为文本框的值。在使用 firefox 进行一些调试后,我们发现如果模板中提供的属性没有定义或给出一个空字符串,那么它会尝试在父作用域链中查找它,直到全局作用域。仅当我们尝试使用“this.view”重新加载视图时才会发生这种情况(但不是在刷新或新模板加载期间)例如,如果我们有一个如下所示的文本框;
< input type="text" name="foo" id="foo" value="${foo}"/>
如果 'foo' 提供了空字符串或控制器不提供,那么它正在寻找全局范围,即。它正在触发 $('#foo') 返回输入文本框对象。现在这个对象被渲染为文本框的值,因此显示“[object HTMLInputElement]”作为文本框的值。我们也在最新的 chrome 版本中看到了这种行为。如果我们更改输入元素的模板属性名称或 id 以使其不匹配,那么它工作正常。例如
< input type="text" name="foo" id="foo1" value="${foo}"> -- this is working
< input type="text" name="foo" id="foo" value="${foo1}"/> --this is working
但是,更改 id 或属性名称是一项昂贵的操作,因为它需要访问整个应用程序并更改模板。这是一个巨大的影响,因为我们有超过 200 个模板文件。
因此,我在 tmpl.js 中编辑了 342 上的函数 buildTmplFn 并更改了以下代码: 在 buildTmplFn 中,将下面的 Line1 更改为下面的 Line2:
.replace( /\$\{([^\}]*)\}/g, "{{= $1}}" ) --> Line1
.replace( /\$\{([^\}]*)\}/g, "{{= \$item\.data\.$1}}" ) -->Line2
这解决了这个问题。 由于这需要编辑库文件(升级期间需要维护),我只是想知道是否有人找到了不需要覆盖库但只需要覆盖'buildTmplFn'函数的解决方案。
提前致谢!