Магистраль — синхронизация не определяет URL-адрес моей коллекции

У меня есть отношения альбомов и песен. В новом представлении альбома я одновременно запрашиваю песни, я пытаюсь сначала сохранить модель альбома, а затем сохранить коллекцию песен и прикрепить ее к альбому.

Определение моей коллекции песен:

define(function(require){
   var Song = require('models/songModel');

   Songs = Backbone.Collection.extend({
     url: 'songs/',         
     model: Song,           
   });

   return Songs;
});

Я создаю свою коллекцию песен следующим образом:

this.songCollection = new Songs();
//In some other view that saves the songs files and returns a hash
that.songCollection.add({title:file.name,song_file:response['file_hash']});

Затем я сохраняю свою модель альбома и успешно пытаюсь сохранить коллекцию песен, добавляя новый альбом pk ко всем моделям в коллекции песен:

that = this;
this.model.save(null,{                                 
    success: function(model,response){
       that.songCollection.each(function(song){                                                                                                     
          song.set('album',model.get('id'));
       });
       that.songCollection.sync('create');                                    
    },               
    error: function(response){                         
       console.log(response);                         
    }
 });

Однако он возвращает A 'url' property or function must be specified, но я указал его, как вы могли видеть ранее. Я также пытался зарегистрировать его перед вызовом синхронизации, и он правильно возвращает URL-адрес. Я что-то пропустил в процессе? Или я не могу создать все эти новые песни на своем сервере сразу вот так?


person Nocturn    schedule 08.04.2013    source источник
comment
Попробуйте установить свойство urlRoot вашей модели (не коллекции).   -  person craftsman    schedule 09.04.2013
comment
Я тоже пробовал это, но он продолжает возвращать ту же ошибку.   -  person Nocturn    schedule 09.04.2013


Ответы (1)


Вам нужно сохранить каждую песню отдельно. sync не предназначен для прямого вызова, и только метод read предназначен для работы с коллекцией. sync('read') вызывается во время collection.fetch().

that = this;
this.model.save(null,{                                 
    success: function(model,response){
       that.songCollection.each(function(song){                                                                                                     
          song.save({album: model.get('id')});
       });                                   
    },               
    error: function(response){                         
       console.log(response);                         
    }
 });
person Paul Hoenecke    schedule 08.04.2013
comment
Спасибо! В этом была проблема. Я думал, ты сможешь сохранить всю коллекцию сразу. - person Nocturn; 10.04.2013