具有淘汰可观察性的类似小胡子的语言
Mustache-like language with knockout-observables
我正在尝试使用带有小胡子语言的 Knockout 风格的视图模型。
所以视图模型看起来像这样:
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 中使用类似 Mustache 的库的经验并处理过这种关系(包括哪些 mustache 库最合适)?
FWIW,我最终使用了 dust.js,并通过向 ko.subscribable.fn
添加一个 then
函数来制作 ko.subscribable 的 thenable
(使用 then
解决方案在 dust.js) 的下一个版本中被优先考虑。
我正在尝试使用带有小胡子语言的 Knockout 风格的视图模型。
所以视图模型看起来像这样:
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 中使用类似 Mustache 的库的经验并处理过这种关系(包括哪些 mustache 库最合适)?
FWIW,我最终使用了 dust.js,并通过向 ko.subscribable.fn
添加一个 then
函数来制作 ko.subscribable 的 thenable
(使用 then
解决方案在 dust.js) 的下一个版本中被优先考虑。