Javascript 在模型上使用JSON.stringify时,主干集合未包含在JSON字符串中
我遇到了一个问题,模型中的集合属性(在本例中是参数集合)没有包含在JSON.stringify函数创建的JSON字符串中。为什么会发生这种情况?它基本上只是排除它,并将其余变量添加到JSON字符串中 活动内容如下:Javascript 在模型上使用JSON.stringify时,主干集合未包含在JSON字符串中,javascript,json,backbone.js,Javascript,Json,Backbone.js,我遇到了一个问题,模型中的集合属性(在本例中是参数集合)没有包含在JSON.stringify函数创建的JSON字符串中。为什么会发生这种情况?它基本上只是排除它,并将其余变量添加到JSON字符串中 活动内容如下: EventAggregator.on('toggleFacet', function (facets) { var facets = SearchOptionsUtil.getCheckedFacets(facets);
EventAggregator.on('toggleFacet', function (facets) {
var facets = SearchOptionsUtil.getCheckedFacets(facets);
var sortOptions = SearchOptionsUtil.getSortOptions();
var searchOptions = new SearchOptionsModel();
for(var facet in facets){
var id = facet;
var value = facets[facet];
searchOptions.parameters.add(new ParameterModel({id: id, values: value.split(',')}));
}
var criteria = $.extend(facets, sortOptions);
location.hash = UriUtil.getUriHash(criteria);
RequestUtil.requestSearchResults(searchOptions);
});
以下是回执:
requestSearchResults: function (searchOptions) {
//fetch the results
var performSearchModel = new PerformSearchModel();
var searchOptionsJson = JSON.stringify(searchOptions);
performSearchModel.fetch({
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify({searchOptionsJson: searchOptionsJson}),
success: function (response) {
console.log("Inside success");
console.log(response);
},
error: function (errorResponse) {
console.log("Inside Failure")
console.log(errorResponse.responseText)
}
}) //have to wait for the fetch to complete
.complete(function () {
//show our regions
App.facetsRegion.show(new FacetListView({collection: performSearchModel.facets}));
App.resultsRegion.show(new ResultListView({collection: performSearchModel.results}));
//perform search fetch complete
});
}
以下是模型:
var SearchOptionsModel = Backbone.Model.extend({
defaults: {
parameters: ParameterCollection,
currentItemId: '{EE8AA76E-0A3E-437B-84D8-AD7FCBAF2928}',
sortBy: 0,
sortDirection: 'asc',
resultsPerPage: 10
},
initialize: function () {
this.parameters = new ParameterCollection();
//fetch calls an on change event.
this.on("change", this.fetchCollections);
},
url: function () {
return '/Services/Search/SearchService.asmx/SearchOptions';
},
parse: function (response) {
var data = JSON.parse(response.d);
return data;
},
fetchCollections: function () {
//when we call fetch for the model we want to fill its collections
this.parameters.set(
_(this.get("parameters")).map(function (parameter) {
return new ParameterModel(parameter);
})
);
}
});
更新**
因此,我改变了在SearchOptionsModel中创建和添加参数集合的方式,JSON对象的格式正确。我把它改成:
var searchOptions = new SearchOptionsModel();
for(var facet in facets){
var id = facet;
var value = facets[facet];
searchOptions.parameters.add(new ParameterModel({id: id, values: value.split(',')}));
}
为此:
var parameters = new ParameterCollection();
//loop through all of the variables in this object
for(var facet in facets){
var id = facet;
var value = facets[facet];
parameters.add(new ParameterModel({id: id, values: value.split(',')}));
}
var searchOptions = new SearchOptionsModel({parameters: parameters});
现在,参数填充在模型中的属性下,我在searchOptions对象上看到一个空的参数变量(之前已填充)。如果我没有显式创建SearchOptionsModel,为什么会在其中设置参数变量?这是因为参数默认设置为集合吗?要将主干模型转换为JSON,必须使用
toJSON
方法:
model.toJSON();
检查这里的文档:当点击
JSON.stringify
时,您是否检查了参数是否正确?我想知道问题是否在于对fetchCollections
的异步调用正在清除从“facets”中添加的内容。我查看了这些内容,并填充了parameters对象,我用解决方案更新了问题,尽管它确实引出了另一个问题..调用JSON.stringify
将自动调用传递给它的对象上的toJSON
(如果该方法存在)。