Skip to content

Instantly share code, notes, and snippets.

@AlexShkor
Last active December 17, 2015 02:59
Show Gist options
  • Save AlexShkor/5539994 to your computer and use it in GitHub Desktop.
Save AlexShkor/5539994 to your computer and use it in GitHub Desktop.
Parsing KnockoutJS model into flat key-value form data
var parseValues = function (data, callback, prefix, postfix) {
postfix = postfix || "";
prefix = prefix || "";
for (var key in data) {
if (data[key] == null) {
continue;
}
if ( Object.prototype.toString.call( data[key] ) === '[object Array]') {
parseValues(data[key], callback, prefix + key + postfix + "[", "]");
} else if (typeof data[key] == "object") {
parseValues(data[key], callback, prefix + key + postfix + ".");
} else {
callback(prefix + key, data[key]);
}
}
};
ko.utils.submitForm = function (urlOrForm, data, options) {
options = options || {};
var params = options['params'] || {};
var includeFields = options['includeFields'] || this.fieldsIncludedWithJsonPost;
var url = urlOrForm;
// If we were given a form, use its 'action' URL and pick out any requested field values
if ((typeof urlOrForm == 'object') && (ko.utils.tagNameLower(urlOrForm) === "form")) {
var originalForm = urlOrForm;
if (originalForm && originalForm.action)
url = originalForm.action;
else {
url = window.location.href;
}
for (var i = includeFields.length - 1; i >= 0; i--) {
var fields = ko.utils.getFormFields(originalForm, includeFields[i]);
for (var j = fields.length - 1; j >= 0; j--)
params[fields[j].name] = fields[j].value;
}
}
data = ko.utils.unwrapObservable(data);
var form = document.createElement("form");
form.style.display = "none";
form.action = url;
form.method = options["method"] || "post";
parseValues(data, function(key,value){
var input = document.createElement("input");
input.name = key;
input.value = value;
form.appendChild(input);
});
for (var key in params) {
var input = document.createElement("input");
input.name = key;
input.value = params[key];
form.appendChild(input);
}
document.body.appendChild(form);
options['submitter'] ? options['submitter'](form) : form.submit();
setTimeout(function () { form.parentNode.removeChild(form); }, 0);
};
ko.utils.buildQueryUrl = function (data, excludeKeysList, includeDefaultValues) {
var query = "";
parseValues(data, function (key, value) {
if ((value || includeDefaultValues) && !isKeyExcluded(key, excludeKeysList)) {
query += encodeURIComponent(key) + "=" + encodeURIComponent(value) + "&";
}
});
return query;
};
@AlexShkor
Copy link
Author

Coverting from this

{"dealId":"51a33f96cb5c8135042a881b","tags":[{"id":1,"title":"draw trumps","selected":true},{"id":3,"title":"establish side suit","selected":true},{"id":4,"title":"communication","selected":true}]}

to this

tags[0].id:1
tags[0].title:draw trumps
tags[0].selected:true
tags[1].id:3
tags[1].title:establish side suit
tags[1].selected:true
tags[2].id:4
tags[2].title:communication
tags[2].selected:true
dealId:51a33f96cb5c8135042a881b

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment