将 jsrender 迁移到 jsviews {{else}}-issue

Migrating jsrender to jsviews {{else}}-issue

jsrender/jsviews 问题。 我已经建立了一个成功利用 jsrender v.0.9.83 的大页面。

但是现在,当我尝试合并 jsviews v.0.9.89(并尝试使用 jsrender v.0.9.89)时,我 运行 遇到了最奇怪的错误。

{{else}} 块似乎会导致错误。

这是 if else 块的示例:

{{if device_comment}}
    {{:device_comment}}
{{else}}
    {{:device_name}}
{{/if}}

这在以前的版本中运行良好,没有问题。

然而现在jsviews报告呈现错误:

JsViews Error: Syntax error
Compiled template code:

// jsvTmpl
var v,t=j._tag,c=j._cnvt,ret=""

+"\n<tr data-id=\"";
try{
ret+=((v=data.id)!=null?v:"");
}catch(e){ret+=j._err(e,view,undefined);}ret=ret
+"\">\n <td><input type=\"checkbox\" class=\"sel\"/></td>\n <td>";
try{
ret+=((v=data.id)!=null?v:"");
}catch(e){ret+=j._err(e,view,undefined);}ret=ret

+"<br/>(";
try{
ret+=((v=data.id)!=null?v:"");
}catch(e){ret+=j._err(e,view,undefined);}ret=ret
+")</td>\n  <td>\n      ";
try{
ret+=t("if",view,this,[
{view:view,tmpl:1,
    params:{args:['device_comment']},
    args:[data.device_comment],
    props:{}},;
}catch(e){ret+=j._err(e,view,undefined);}ret=ret
{view:view,tmpl:2,
    params:{args:[]},
    args:[],
    props:{}}]);
}catch(e){ret+=j._err(e,view,undefined);}
........ (cut to save space) ...........
return ret;
: "Unexpected token ;"

我能找到的唯一意想不到的标记是“,;”在这部分:

view:view,tmpl:1,
    params:{args:['device_comment']},
    args:[data.device_comment],
    props:{}},;

现在,有趣的是,如果我找到并删除所有 {{else 块,模板将无错误地呈现(但当然不正确,因为我的页面需要基于 else 块的格式)。

我的问题是,这怎么可能? 在这些情况下,jsviews 想要做的与 jsrender 有什么不同? 为什么 else 块无法正确呈现?

编辑: 我下载了旧版本的 jsviews,v.0.9.83,然后将它与 jsrender v.0.9.83 一起使用,一切正常。我没有得到这个 {{else}}-block 问题。

我将保留此问题,因为较新的 jsviews 库中似乎存在问题。希望其他人会注意到这一点 post 而不必对其进行大量调试。

我将继续使用 v.0.9.83 进行工作。

感谢您提出这个问题。事实上它是在 v0.9.89 中引入的一个错误(所以以前的版本都很好,直到 v0.9.88)。

但是这个错误只有在你设置了 $.views.settings.debugMode(true); 时才会出现。如果您将 debugMode 设置为 false,则一切正常。

该错误已在 v0.9.90 版本中修复。

顺便说一句,对于你给出的具体例子:

{{if device_comment}}
    {{:device_comment}}
{{else}}
    {{:device_name}}
{{/if}}

你可以换成更简单的:

{{:device_comment||device_name}}

这也避免了遇到那个问题...