Конвертер jsviews/jsrender не работает с тегом {{:...}}

Я пытаюсь использовать конвертер для изменения строки в шаблоне jsrender, но я не могу заставить конвертер работать с тегом. Используя пример в документации по API JsRender. Например, используя конвертеры:

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

Тогда в моем HTML {{upper:Name}} который выдает ошибку в консоли: TypeError: val не определен, а шаблон не отображается вообще.

Тем не менее, если я применяю конвертер непосредственно к такой строке {{upper:"This should be uppercase"}} выводит строку в верхнем регистре, как и ожидалось.

{{:Name}} тег сам по себе работает нормально, так почему же с ним не работает конвертер?

Если это уместно, это проект ASP.NET-MVC, а данные JSON, представленные шаблоном, поступают из $.post('@Url.Action(..,..)')... ответ. Он работает отлично, пока я не попытаюсь применить конвертер к тегу. Конвертеры не используются в этом сценарии?

1 ответ

Решение

Похоже, ваш Name свойство не определено в некоторых случаях.

Если у вас есть Имя, которое не определено, то {{:Name}} будет отображаться как пустая строка, "" - но {{upper:Name}} выдаст ошибку, т.к. undefined.toUpperCase() не удастся.

Вы можете провести расследование, разбив брошенные ошибки (или поставив точку останова или debugger оператор в конвертере) и видя где твой неопределенный Name идет от.

Вы также можете предотвратить появление ошибки - и вместо этого получить информацию об ошибке - любым из следующих методов

  • записывать {{upper:Name onerror=true}} или же {{upper:Name onerror='bad'}} (см. https://www.jsviews.com/)
  • записывать

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

  • записывать $.views.settings.debugMode(true);

и посмотреть, что вы получите, чтобы узнать, где ваш неопределенный Name происходит

Другие вопросы по тегам