我有以下型号:
var model = {
A: 'One',
B: 'Two',
C: 'Three'
};
我结合各种UI元素,以这些领域,它的伟大工程。 不过,我转换模型回JavaScript对象,所以我可以保存到服务器的任何变化:
var goingToServer = ko.toJS(model);
goingToServer
将包括性质A,B和C.然而,假设属性C是永远不会改变的数据的大块。 我想避免这种发送回服务器。
有没有一种方法,使toJS()
只包括一组预定义的字段转换模型时回JavaScript对象?
有一件事我一直在研究的是淘汰赛映射插件 。 它有一个叫做设置包括记录为这样的:
当转换您的视图模型回一个JS对象,默认情况下,映射插件将只包含了你原来的视图模型的部分特性,但它也包括即使这不是你的原始对象的一部分淘汰赛产生_destroy财产。 但是,您可以选择自定义此阵:
然而,它显示为记载,作为这个插件不起作用ko.mapping.toJS()
仍将包括A,B和C,即使我通过在一个include
的阵列['A', 'B']
我猜这个功能旨在为包括没有在原来的模型附加字段。
有没有办法转换模型时回JavaScript对象,以排除某些属性,短期做一些哈克如生成对象,发送到服务器之前手动删除我不想要的属性?
你有没有试过ignore
关键字? 它有一个类似的使用的包括:
var mapping = {
'ignore': ["propertyToIgnore", "alsoIgnoreThis"]
}
var viewModel = ko.mapping.toJS(data, mapping);
你可以只使用忽略,当你做服务器数据的原始映射,那么它会不会是你的目标时都当你将其转换回JS。
如果我们有下vm.Payment观察的引用作为一个复杂的对象模型实例:
{ "Summary": { "Count": 12, "PaymentAmount": 1500, "PaymentMethod": "Cheque", "PaymentDate": "2015-04-08T22:38:48.552Z", "AgentOid": 1208795, "AgentName": "Asere Ware" } //[...] }
并且需要忽略只有一些内在的特性,则:
var mapping = { 'ignore': ['Summary.PaymentMethod', 'Summary.PaymentDate'] //avoid lost some initialized values. }; // map updating existing observable (Payment) under my ViewMode (vm) with source "data" JSON object. ko.mapping.fromJS(data, mapping, vm.Payment);
这是vm.Payment内容,其中只有付款方法和PAYMENTDATE被keept结果:
{ "Summary": { "Count": 0, "PaymentAmount": 0, "PaymentMethod": "Cheque", "PaymentDate": "2015-04-08T22:38:48.552Z", "AgentOid": undefined, "AgentName": undefined } //[...] }
好吧,我已经想通了一个解决方案,它的工作原理虽然我希望能有一个更好的办法。 关键是要忽略在映射插件这些字段,然后手动添加它们在作为计算领域。 当计算领域将永远不会在生成的JavaScript对象最终toJS
被调用。
// Utility function to quickly generate a computed field
ko.readonly = function (value)
{
return ko.computed(function ()
{
return value;
});
};
// View Model
var ViewModel = function (project)
{
var readonly = ['B', 'C', 'D']; // Fields I want to ignore
var mapping = {
'ignore': readonly //Read-only properties, we'll add these manually as computed fields
};
// Use Mapping plugin to make everything observable, except the fields above
ko.mapping.fromJS(project, mapping, this);
// Now loop through the read only array and add these fields in as computed
for(var i = 0; i < readonly.length; i++)
{
var field = readonly[i];
this[field] = ko.readonly(project[field]);
}
}
现在我可以绑定到这些视图模型为正常:
ko.applyBindings(new ViewModel(data));