2016-06-08 8 views
0

Я пытаюсь использовать модель представления типа «нокаут» с усами-подобным языком.Усыстоподобный язык с нокаутом-наблюдаемыми

Так вид модели выглядит примерно так:

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, и работал через отношения (в том числе, какие библиотеки усов наиболее подходят)?

+0

Интересный (но, вероятно, не выполнимый) подход также может заключаться в определении методов «getter» и «setter» в наблюдаемых наблюдателях viewmodel. Как в этом примере Райан Нимейер: https://jsfiddle.net/rniemeyer/mrCSH/ Я могу себе представить, что вы хотите найти решение в шаблоне, но вместо того, чтобы изменить способ определения своих моделей просмотра ... – user3297291

+0

@ user3297291 Да, это определенно вариант, который я должен был упомянуть. Для этого можно использовать [Knockout-es5] Стива Сандерсона (https://github.com/SteveSanderson/knockout-es5). Тем не менее, Knockout-ES5 не всегда подходит. –

+0

Кстати, я считаю, что 'dust.js' LinkedIn очень прощает многие правильные пути. :) –

ответ

0

FWIW, я закончил с использованием dust.js, и делая ko.subscribable-х thenable, добавив then функцию ko.subscribable.fn (с разрешением then быть приоритетными в следующем выпуске dust.js).