Knockout.js 将敲除映射与敲除ValidatedObservable一起使用

Knockout.js 将敲除映射与敲除ValidatedObservable一起使用,knockout.js,knockout-mapping-plugin,knockout-validation,Knockout.js,Knockout Mapping Plugin,Knockout Validation,我正在努力解决如何在使用validatedObservable的同时从ajax调用更新绑定的viewmodel 之前,我从ajax调用中获取初始数据,初始绑定方式如下: self.quote = ko.mapping.fromJS(result.data, self.quoteMapping); ko.applyBindings(self); 当用户在“quote”中更改了某些内容时,我会进行另一个ajax调用来传递更改,ajax调用返回的结果将是完整的“quote”(我确实需要带上整个“q

我正在努力解决如何在使用
validatedObservable
的同时从ajax调用更新绑定的viewmodel

之前,我从ajax调用中获取初始数据,初始绑定方式如下:

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

ko.applyBindings(self);
当用户在“quote”中更改了某些内容时,我会进行另一个ajax调用来传递更改,ajax调用返回的结果将是完整的“quote”(我确实需要带上整个“quote”,因为对quote上的一个项目的更改可能会影响服务器端的其他项目以及顶层中的其他属性,因此需要在客户端视图模型中更新这些属性),我将使用(使用fromJS的其他签名)更新绑定视图模型,因此:

但是,现在我希望视图模型是一个
validatedObservable

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

ko.applyBindings(self);
但是我被困在如何用一个经过验证的可观察对象更新视图模型上

我不能使用ko.mapping.fromJS(result.data,self.quote);,因为这样会用一个普通的可观察对象(而不是一个经过验证的可观察对象)更新self.quote,而且出人意料的是这不起作用

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

可观察到的平面(有效):

已验证的可观察(不包括):

我很感激任何关于我需要做什么的线索,以便能够从ajax调用中获得一个修改后的“报价”,并使用ko映射更新我的已验证的可观测值

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

我不能使用
ko.mapping.fromJS(result.data,self.quote);
,因为这样会用一个普通的可观察对象(而不是一个经过验证的可观察对象)更新self.quote,而且这显然不起作用

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

您可以通过传递一个options对象来定义其他行为。在这种情况下,您希望返回一个已验证的可观察对象

我引用的文档示例有一个变化:

var mapping = {
    'children': {
        create: function(options) {
            return ko.validatedObservable(options.data);
        }
    }
}
var viewModel = ko.mapping.fromJS(data, mapping);
当然,您也可以在映射选项的根级别使用
create
,但是映射插件还允许您更加具体


旁注:尝试重新使用相同的函数来初始化和更新viewmodel。没有真正的理由让更新前后的两段代码保持相同的可观察性。

我知道我做错了!:D我只需要朝正确的方向轻推一下(而不是因为错过了明显的东西而感到厌烦).我的映射定义中的create函数(self.QuoteMapping in
ko.mapping.fromJS(result.data,self.QuoteMapping)
-请参见我问题中的代码)返回可观测值,所以这就是我做错的地方。这意味着轻推。;)一个纯粹的尖刻回答不会包含指向正确方向的指针。嗯,是的,没错我还有一个用法/语法问题,你可以提醒我!我可以在子对象上获取
create
,以返回一个已验证的可观察对象,但是如何从顶层获取
validatedObservable
。我已经更新了“已验证的可观察”的注释,这些注释引用了你的SO用户名,表明了我的苦衷。轻推(即使是刺耳的!;>)也值得欣赏。@steve不使用映射插件构建对象图,而是快速地创建相互引用的独立视图模型,让它们在映射插件的最小参与下创建自己。我已经把你的副手全部重写了。它现在具有一个自给自足的应用程序->报价->报价项视图模型层次结构。请参阅:。我认为这很接近你应该怎么做。还要注意视图的修改。感谢您的帮助,这会更整洁,并且在添加过程中也能正常工作,但我仍然在努力解决如何从映射中获取ValidatedObservable。我希望能够调用例如quote.isValid(可能我有误解,但我的印象是ko验证可以处理对象层次结构中有效性的“冒泡”),从quote中获取验证错误,从而在验证摘要中显示它们。我怀疑我遗漏了一些关于ko验证的基本信息。
var mapping = {
    'children': {
        create: function(options) {
            return ko.validatedObservable(options.data);
        }
    }
}
var viewModel = ko.mapping.fromJS(data, mapping);