2013-05-17 75 views
3

我正在使用knockoutjs映射插件从JSON构建视图模型。然后,将该模型的属性绑定到表单上的字段。问题是如何让模型中的字段从JSON生成所需?使用JSON敲除需要的字段

例如,如果我加载JSON是这样的:

$.getJSON('/Department/GetEmptyModel/', function (data) { 
    var mapped = ko.mapping.fromJS(data); 
    self.AddDepartmentModel(mapped); 
}); 

,并保存它是这样的:

self.AddDepartmentModel.AddDepartment = function() { 
    $.ajax({ 
     url: "/Department/Add/", 
     type: 'post', 
     data: ko.toJSON(self.AddDepartmentModel), 
     contentType: 'application/json', 
     success: function (result) { 
      self.ListOfDepartments.GetListOfAllDepartments(); 
     } 
    }); 
}; 

我如何才能确保所有必需的字段是否有保存之前发生?

谢谢

回答

2

我有一个类似的问题而回,这是我如何解决它:

添加自定义扩展

ko.extenders.spaceNotAllowed = function(target, options){ 
    target.hasError = ko.observable(); 
    target.validationMessage = ko.observable(); 
    var validate = function(newValue) { // Validation for a field that shouldnt contain spaces 
     if(value.indexOf(" ") === -1) target.hasError(false); 
     else { 
      target.hasError(true); 
      target.validationMessage(target.hasError() ? options.errorMessage || "No spaces allowed" : ""); 
     } 
    } 
    validate(target()); 
    target.subscribe(validate); 
    return target;  
} 

在视图模型:

使用扩展器在我的视野模型需要验证

var ViewModel = { 
    var self = this; 
    self.noSpaces = ko.observable('initialValue').extend({spaceNotAllowed: {errorMessage: 'no spaces allowed'}}); 
} 

选项1现在,如果你有一个提交你的HTML页面按钮,就可以将数据绑定这样的:

<button type='button' data-bind='click: saveStuff, enable: !noSpaces.hasError'>Save</button> 

这样一来,“保存按钮”将仅启用验证通过。当我遇到同样的问题,并且当时我还是比较新的淘汰赛的时候,我发现了这个答案。

选项2 检查领域AJAX之前是有效的:

if(self.noSpaces.hasError) { 
    // Do something here 
    return; 
} 
$.ajax(....); 

此链接介绍了如何在淘汰赛使用自定义扩展:Using extenders to augment observables