将 Knockout 映射与 Knockout ValidatedObservable 结合使用

Using Knockout mapping with Knockout ValidatedObservable

我正在努力解决如何在使用 validatedObservable.

时从 ajax 调用更新我的绑定视图模型

之前我从 ajax 调用中获取初始数据并像这样进行初始绑定:

self.quote = ko.mapping.fromJS(result.data, self.quoteMapping);

ko.applyBindings(self);

并且当用户在 'quote' 中更改某些内容时,我会进行另一个 ajax 调用以传递更改,并且来自 ajax 调用的 return 将是完整的 'quote'(而我 do 需要带来整个 'quote',因为对报价中的一项进行更改可能会在服务器端影响其他项目,并且顶层的其他属性因此需要在客户端视图模型中更新),我将使用(使用 fromJS 的其他签名)更新绑定视图模型,因此:

ko.mapping.fromJS(result.data, self.quote);

但是,现在我希望视图模型成为 validatedObservable。对于初始负载,这非常简单:

self.quote = ko.validatedObservable(ko.mapping.fromJS(result.data, self.quoteMapping));

ko.applyBindings(self);

但我一直在研究如何使用经过验证的可观察对象更新视图模型

我不能使用 ko.mapping.fromJS(result.data, self.quote); 因为那会更新 self.quote普通 observable 不是经过验证的 observable 并且毫无疑问是行不通的。

这里有几个非常简化的小提琴来说明问题。

Plain Observable(有效): https://jsfiddle.net/stevedavey/1tup0agt/

已验证的 Observable(未验证): https://jsfiddle.net/stevedavey/yh233wht/

我很感激任何关于我需要做什么才能从 ajax 调用中获得修改后的 'quote' 并使用 ko 映射更新我已验证的可观察量的线索。

我怀疑我误解了一些基本的东西。

I can't use ko.mapping.fromJS(result.data, self.quote); because that will update self.quote with a plain observable not a validated observable and unsurpisingly that doesn't work.

你可以使用ko.mapping.fromJS,你只是做错了。花时间阅读 the documentation of the mapping plugin - 它只有一页,甚至不长。

您可以通过传递选项对象来定义其他行为。在这种情况下,你想要 customize object creation using create - 比如返回一个经过验证的可观察对象。

我在引用文档示例时做了一处更改:

var mapping = {
    'children': {
        create: function(options) {
            return ko.validatedObservable(options.data);
        }
    }
}
var viewModel = ko.mapping.fromJS(data, mapping);

当然您也可以在映射选项的根级别使用 create,但是映射插件还允许您更加具体。

旁注:尝试重新使用相同的函数来初始化和更新您的视图模型。没有真正的理由让两段不同的代码围绕更新同一个可观察对象。