【发布时间】:2013-11-25 02:40:19
【问题描述】:
我为 Yesod(一个 Haskell Web 框架)编写了一个简洁的小 knockout.js 绑定,但是我在处理可选定义的值时遇到了一些麻烦。绑定的 Haskell 部分旨在提供 javascript 片段,该片段对同一处理程序进行 Ajax 调用,并接收由 ko.mapping 解析的 JSON 对象。还有一些用于自定义的钩子。
这一切都很好,但我在处理可选值时遇到了问题。如果我提供一个带有可选记录的值,JSON 发射器会将其视为可选并且不会发射它。
因此,例如,请求的 JSON 响应
data Foo = Foo { bar :: Maybe Int
, baz :: Int
}
serveThis :: Foo
serveThis = Foo (Nothing) 0
是 { baz: "0" }
我明白为什么会这样,并且我可以改变它(但如果可能的话,我宁愿不这样做)。问题是当我在 serveThis 的 JSON 表示上调用 ko.mapping.fromJS 时,bar 字段没有变成可观察的。好的,我也明白了。我可以使用 with 绑定来进行条件数据绑定。但我不知道足够的 JavaScript 来有条件地定义计算的 observables。
我的真实代码如下:
var ViewModel = function (data) {
ko.mapping.fromJS(data, {}, this);
this.notes.stdDev.percent = ko.computed( function () {
return numeral( this.notes.stdDev() ).format("0%");
}, this);
}
所以,如果标准偏差没有在 Haskell 端定义,它就不会作为 JSON 字段发出,因此 ko.mapping 不会使其成为可观察的。那么如何有条件地定义百分比表示呢?
【问题讨论】: