使用具有Knockout ValidatedObservable的Knockout映射

时间:2016-10-11 15:52:47

标签: knockout.js knockout-mapping-plugin knockout-validation

我在使用"images/flags/"时如何从ajax调用更新绑定的viewmodel时遇到了困难。

以前我从ajax调用中获取初始数据,并且如下所示:

validatedObservable

当用户更改了引用中的内容时,我会再次传递更改的ajax调用,并且ajax调用的返回将是完整的引用'引用' ; (并且我需要带上整个'引用',因为对报价中的一个项目的更改可以在服务器端影响其他项目以及顶级的其他属性因此需要在客户端视图模型中更新,我将使用(使用fromJS的其他签名)更新绑定视图模型,因此:

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

ko.applyBindings(self);

但是,现在我希望视图模型为ko.mapping.fromJS(result.data, self.quote); 。对于初始负载,这非常简单:

validatedObservable

但我仍然坚持如何使用经过验证的可观察

更新视图模型

我无法使用 ko.mapping.fromJS(result.data,self.quote); ,因为这会更新self.quote,其中包含一个普通的observable,而不是一个经过验证的可观察对象,并且毫不含糊不起作用。

以下是一些用于说明问题的非常简化的小提琴。

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

验证的Observable(不会): https://jsfiddle.net/stevedavey/yh233wht/

我很欣赏任何关于我需要做些什么的线索才能获得修改后的引用'来自ajax调用并使用ko映射更新我验证的observable。

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

1 个答案:

答案 0 :(得分:1)

  

我不能使用ko.mapping.fromJS(result.data, self.quote);,因为这会更新self.quote,其中包含一个普通的observable,而不是一个经验证的observable,并且不起作用。

你可以使用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,但映射插件也可以让您更具体。

附注:尝试重新使用相同的函数来初始化和更新viewmodel。没有任何理由保持两个不同的代码片段更新相同的可观察量。