简体   繁体   中英

Populating data from JSON for drop downs

I am receiving JSON from the server which looks like

{
    "accountType": ["Full","Trial"],
    "states": [
        {"state":"AL","stateDescription":"Alabama","featured":"A1"},
        {"state":"AK","stateDescription":"Alaska","featured":"B1"}
    ],
    "dates":[
        {"dateDescription":"Jan","month":1,"year":2008},
        {"dateDescription":"Feb","month":2,"year":2008}
    ]
}

In the Backbone file I'm doing:

define([ 'backbone', 'underscore', 'vent', ], function (Backbone, _, vent) {
    'use strict';

    return Backbone.Model.extend({

        url: {},

        loaded: false,

        defaults: {
            accountType: [],
            states: [],
            dates: [],
        },


        initialize: function () {
            this.on('change', this.change);
            var that = this;

            $.getJSON("webapp/jsondata", function (data) {
                that.set({
                    states: data.states.state,
                });
            });

            $.getJSON("webapp/jsondata", function (data) {
                that.set({
                    dates: data.dates.dateDescription,
                });
            });

            $.getJSON("webapp/jsondata", function (data) {
                that.set({
                    accountType: data.accountType,
                });
           });
        },  
    });
});

So each $.getJSON should get the relevant data and populate the backbone model defaults.

Except at the moment only the account type works. I don't understand why this would work and the others wouldn't as it's the same code. The only difference is in the JSON data, accountType has 2 pieces of data. States has 3 and I only want to return one piece of this ( state ).

So I guess my issue is in specifying the data being retrieved in the $.getJSON code but many hours online have not revealed an answer.

Your states and dates keys in your data are arrays, but you try to access them as hashes. If you want to extract the state keys from your states array, you can use _.pluck :

$.getJSON("webapp/jsondata", function (data) {
    that.set({
        states: _.pluck(data.states, 'state')
    });
});

With the data given, _.pluck(data.states, 'state') will give you ["AL", "AK"]

Not that, as written, your model could be greatly simplified by using model.fetch with model.parse . For example :

return Backbone.Model.extend({
    url: "webapp/jsondata",
    loaded: false,
    defaults: function () {
        return {
            accountType: [],
            states: [],
            dates: [],
        };
    },

    parse: function (data) {
        return {
            accountType: data.accountType,
            states: _.pluck(data.states, 'state'),
            dates: _.pluck(data.dates, 'dateDescription')
        };
    },

    initialize: function () {
        this.on('change', this.change);
        this.fetch();
    },  
});

And beware using arrays in a defaults hash, use a function instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM