jsviews/jsrender 转换器无法处理 {{:...}} 标签

jsviews/jsrender Converter not working on {{:...}} tag

我正在尝试使用转换器修改 jsrender 模板中的字符串,但我似乎无法让转换器在标签上工作。 例如,使用 JsRender API documentation Using converters 上的示例,我有:

<script>
    $.views.converters("upper", function(val) {
        return val.toUpperCase();
    });
</script>

然后在我的 HTML 中我有 {{upper:Name}} 在控制台中抛出错误:TypeError: val is undefined,并且模板不呈现完全没有。

但是,如果我将转换器直接应用于 {{upper:"This should be uppercase"}} 这样的字符串,它会按预期输出大写字符串。

{{:Name}} 标签本身工作正常,那么为什么转换器不能使用它呢?

如果相关,这是一个 ASP.NET-MVC 项目,模板呈现的 JSON 数据来自 $.post('@Url.Action(..,..)')... 响应。在我尝试将转换器应用于标签之前,它一直运行良好。转换器在这种情况下不可用吗?

您的 Name 属性 似乎在某些情况下未定义。

如果您有一个未定义的名称,那么 {{:Name}} 将呈现为空字符串,"" - 但 {{upper:Name}} 将抛出错误,因为 undefined.toUpperCase() 将失败。

您可以通过中断抛出的错误(或通过在转换器中放置一个断点或 debugger 语句)来调查,并查看您未定义的 Name 来自哪里。

您还可以通过以下任何技术来防止抛出错误 - 而是获取呈现的错误信息

  • {{upper:Name onerror=true}}{{upper:Name onerror='bad'}}(参见https://www.jsviews.com/#onerror
  • 写入

    $.views.converters("upper", function(val) { return val === undefined ? 'undefined' : val.toUpperCase(); });

  • 写入$.views.settings.debugMode(true);

看看你得到了什么输出,进一步调查你的未定义 Name 发生的地方。