2013-05-17 110 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