Основен родителски модел за извличане с вложена колекция

Моето приложение има следната структура:

Project (model)
     -> tracks (collection)
           -> track (model)
                 -> clips (collection)
                         clip (model)

Трябва да извлека само модел на родителски проект. Това ще доведе до промяна на цялата структура на данните. Получавам JSON

{ "_id" : "123",
  "name" : "name",
  "tracks" : [ { "clips" : [ { "audioName" : "audio name",
              "audioPath" : "audio/path.wav",
              "duration" : 123,
              "id" : "track0-1"
            } ],
        "mute" : false,
        "name" : "track0",
        "selected" : false,
        "volume" : 100
      },
      { "clips" : [  ],
        "mute" : false,
        "name" : "track1",
        "selected" : false,
        "volume" : 100
      }
   ]
}

Имам метод за анализ:

    parse: function (data) { 
        this.get('tracks').reset(data.tracks);
        delete data.tracks;
        return data;
    }

Не мога да анализирам клипове. В проследяването на модела клиповете на атрибути имат поведение като масив на javascript вместо основен модел.

Как мога да анализирам клипове?


person tapak    schedule 19.04.2013    source източник


Отговори (1)


parse се използва само за анализиране на отговорите от сървъра. Така че няма да можете да го използвате, за да създадете своята clips колекция.
Така че може да искате да промените начина, по който правите това (може би погледнете Backbone-relational, мисля, че се занимава с този вид неща) . Ето едно възможно решение (да се постави във вашия модел):

initialize: function() {
  this.listenTo(this, 'change:clips', this.onChangeClips);
  // the rest of your stuff
},
onChangeClips: function() {
  var clips = this.get('clips');
  if(Object.prototype.toString.call(clips) === '[object Array]')
    this.set('clips', new Clips(clips), {silent: true});
}

Източник за тестване дали обектът е масив: Проверете дали обектът е масив?

Забележка: това ще премахне всяка препратка към съществуваща колекция (която изглежда имате), така че може да искате да запазите препратка към вашата колекция във вашия модел (като в атрибут _clips), за да я нулирате с новия масив clips.

person Loamhoof    schedule 19.04.2013
comment
Благодаря ти много. Тази команда: this.set('clips', new Clips(clips), {silent: true}); е това, което търся. Благодаря ти. Сега работи. - person tapak; 20.04.2013