在模型上使用 JSON.stringify 时,主干集合不包含在 JSON 字符串中

Backbone Collection not being included in JSON string when using JSON.stringify on model

本文关键字:JSON 集合 字符串 包含 模型 stringify      更新时间:2023-09-26

我遇到了一个问题,即我的模型中的集合属性(在本例中为参数集合)未包含在 JSON.stringify 函数创建的 JSON 字符串中。有什么理由会发生这种情况吗?它基本上只是排除它并将其余变量添加到 JSON 字符串中。

以下是事件:

                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 对象上看到一个空参数变量(之前正在填充)。如果我没有显式创建参数变量,为什么在搜索选项模型中设置了参数变量?是因为参数默认设置为集合吗?

要将主干模型转换为 JSON,必须使用 toJSON 方法:

model.toJSON();

在此处查看文档: http://backbonejs.org/#Model-toJSON