将 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
,但是映射插件还允许您更加具体。
旁注:尝试重新使用相同的函数来初始化和更新您的视图模型。没有真正的理由让两段不同的代码围绕更新同一个可观察对象。
我正在努力解决如何在使用 validatedObservable
.
之前我从 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
,但是映射插件还允许您更加具体。
旁注:尝试重新使用相同的函数来初始化和更新您的视图模型。没有真正的理由让两段不同的代码围绕更新同一个可观察对象。