我有以下使用JQuery和Knockout的JavaScript(我有特殊理由一起使用2)
$(document).ready(
function () {
var Crime = function (Id, CaseNumber, DateOfIncident, Description) {
var self = this;
self.Id = Id;
self.CaseNumber = CaseNumber;
self.DateOfIncident = DateOfIncident;
self.Description = Description;
}
var CrimesViewModel = function () {
var self = this;
//Data
self.items = ko.observableArray()
//operations
addCrime = function () {
if ($("#AddCrimeForm").valid()) {
crime = new Crime(0,
$("#AddCrimeForm #CaseNumber").val(),
$("#AddCrimeForm #DateOfIncident").val(),
$("#AddCrimeForm #Description").val());
self.items.push(this.crime);
$("#AddCrimeForm #CaseNumber").val("");
$("#AddCrimeForm #DateOfIncident").val("");
$("#AddCrimeForm #Description").val("");
}
}
self.removeCrime = function (item) {
self.items.remove(item);
}
loadCrimes = function (JSONstring) {
try {
self.JSONItems = JSON.parse(JSONstring);
if (self.JSONItems != null)
if (self.JSONItems != null)
for (i = 0; i < self.JSONItems.length; i++)
self.items.push(self.JSONItems[i]);
}
catch (e) {
alert(e.message + "\n\n" + e.description + "\n\n" + e.stack)
}
}
getCrimes = function () {
var self = this;
return JSON.stringify(self.items);
}
}
var CrimesVM = new CrimesViewModel()
ko.applyBindings(CrimesVM, $("#CrimeList")[0])
}
);
如上面的代码所示,我有一个ViewModel,它基本上由一个包含Crime
个对象的数组组成。
getCrimes()
函数的意图是,在调用时,将数组序列化为JSON。
遗憾的是,getCrimes()
函数返回一个空字符串,因为JSON.stringify(self.items)
返回一个空字符串。
知道我在这里做错了吗?
**
**
以下是工作代码,基于以下答案:
$(document).ready(
function () {
var Crime = function (Id, CaseNumber, DateOfIncident, Description) {
var self = this;
self.Id = Id;
self.CaseNumber = CaseNumber;
self.DateOfIncident = DateOfIncident;
self.Description = Description;
}
var CrimesViewModel = function () {
var self = this;
//Data
self.items = ko.observableArray()
//operations
addCrime = function () {
if ($("#AddCrimeForm").valid()) {
crime = new Crime(0,
$("#AddCrimeForm #CaseNumber").val(),
$("#AddCrimeForm #DateOfIncident").val(),
$("#AddCrimeForm #Description").val());
self.items.push(this.crime);
//Update the correspoding hidden field
$("#CrimeCollection_New").val(ko.toJSON(self));
$("#AddCrimeForm #CaseNumber").val("");
$("#AddCrimeForm #DateOfIncident").val("");
$("#AddCrimeForm #Description").val("");
}
}
self.removeCrime = function (item) {
self.items.remove(item);
//Update the correspoding hidden field
$("#CrimeCollection_New").val(ko.toJSON(self));
}
loadCrimes = function (JSONstring) {
try {
self.JSONItems = JSON.parse(JSONstring);
if (self.JSONItems != null)
if (self.JSONItems != null)
for (i = 0; i < self.JSONItems.length; i++)
self.items.push(self.JSONItems[i]);
}
catch (e) {
alert(e.message + "\n\n" + e.description + "\n\n" + e.stack)
}
}
}
var CrimesVM = new CrimesViewModel()
ko.applyBindings(CrimesVM, $("#CrimeList")[0])
}
);
答案 0 :(得分:2)
因为self.items
是一个Knockout observable,所以你应该使用Knockout函数.toJS()
来获取值:ko.toJS(self.items)
。
或者,如果您想将项目直接转换为JSON,可以使用.toJSON()
。