Я пытаюсь использовать модель представления типа «нокаут» с усами-подобным языком.Усыстоподобный язык с нокаутом-наблюдаемыми
Так вид модели выглядит примерно так:
var viewModel = {
aValue: ko.observable("boot")
}
Довольно распространенная проблема, с усами-подобных языков является то, что они не разворачивать модели. Таким образом, получается, например,
mustache_lib.render("{{ aValue }}", viewModel)
=> "function (initialvalue) { function observable() { ..."
Вот что происходит с Nunjucks, среди других (с их соответствующими render
функции).
Можно использовать фильтр с Nunjucks, поэтому следующие работы, как и ожидалось:
nunjucks.renderString("{{ aValue | unwrap }}", viewModel)
=> "boot"
Где unwrap
представляет собой фильтр, будучи ko.unwrap
. Однако я не поклонник синтаксиса, и мне было интересно, есть ли лучший вариант. Я просмотрел код Nunjucks, и было невозможно автоматически развернуть каждую переменную, просмотренную в контексте.
Handlebars.js имеет предпочтительный синтаксис (в моих глазах), например.
Handlebars.compile("{{ unwrap aValue }}")(viewModel)
=> "boot"
К сожалению, если вы забыли unwrap
, то aValue
будет рассматриваться в качестве помощника и называется с нежелательным значением, что-то вроде { data: Object, hash: '', name: '...' }
. Очевидно, один предпочитает, чтобы их язык шаблонов не делал этого. Подобно Nunjucks, Handlebars не имеет возможности изменять контекстные запросы, чтобы автоматически вызывать ko.unwrap
.
Интересно, что Mustache.js вызовет любую переменную, которая является function
(включая, конечно, наблюдаемые). Однако в других библиотеках отсутствует ряд функций.
Имеет ли кто-нибудь опыт использования библиотек, похожих на Усаче, с помощью Knockout, и работал через отношения (в том числе, какие библиотеки усов наиболее подходят)?
Интересный (но, вероятно, не выполнимый) подход также может заключаться в определении методов «getter» и «setter» в наблюдаемых наблюдателях viewmodel. Как в этом примере Райан Нимейер: https://jsfiddle.net/rniemeyer/mrCSH/ Я могу себе представить, что вы хотите найти решение в шаблоне, но вместо того, чтобы изменить способ определения своих моделей просмотра ... – user3297291
@ user3297291 Да, это определенно вариант, который я должен был упомянуть. Для этого можно использовать [Knockout-es5] Стива Сандерсона (https://github.com/SteveSanderson/knockout-es5). Тем не менее, Knockout-ES5 не всегда подходит. –
Кстати, я считаю, что 'dust.js' LinkedIn очень прощает многие правильные пути. :) –