2014-02-18 2 views
0

다음과 같은 모델의 백본 애플리케이션이 있습니다.backbone.js의 모델에서 이벤트 발생 및 수신하기

기본적으로 뮤직 브라우저 애플리케이션입니다. 응용 프로그램은 여러 개의 앨범을로드하며 각 앨범에는 이와 연관된 AlbumMetadata 객체가 있습니다.

또한 앨범에는 노래 모음이 있으며 각 노래에는 SongMetadata 개체가 연결되어 있습니다. 내가 자동으로 각 노래의 SongMetadata를 업데이트 할 수 있도록하려는

var MusicBrowser = MusicBrowser || {}; 

MusicBrowser.SongMetadata = Backbone.Model.extend({ 
    initialize: function() { 
     this.fetch(); 
    } 

}); 

MusicBrowser.AlbumMetadata = Backbone.Model.extend({ 
    initialize: function() { 
     this.fetch(); 
    } 
}); 

MusicBrowser.Song = Backbone.Model.extend({ 
    initialize: function() { 
     var songMetadata = new MusicBrowser.SongMetadata({ albumId: this.collection.albumId, songId: this.get("Id") }); 
     this.set("metadata", songMetadata); 
    } 
}); 

MusicBrowser.Songs = Backbone.Collection.extend({ 
    model: BundleBrowser.Song, 
    initialize: function (models, options) { 
     this.albumId = options.albumId; 
     this.fetch(); 
    } 
}); 

MusicBrowser.Album = Backbone.Model.extend({ 

    initialize: function() { 
     var songs = new MusicBrowser.Songs([], { albumId: this.get('Id') }); 
     this.set('songs', songs); 

     var albumMetadata = new MusicBrowser.AlbumMetadata({ albumId: this.get('Id') }); 
     this.set("metadata", albumMetadata); 
    } 
}); 

MusicBrowser.Albums = Backbone.Collection.extend({ 
    model: MusicBrowser.Album, 
    initialize: function() { 
     this.fetch(); 
    } 
}); 

:

여기
Albums (Collection) 
    | 
    |____ Album 1 (Model) 
     | 
     |____ AlbumMetadata (Model) 
     | 
     | 
     |____ Songs (Collection) 
        | 
        |____ Song 1 (Model) 
        |   | 
        |   |____ SongMetadata (Model) 
        | 
        |____ Song 2 (Model) 
           | 
           |____ SongMetadata (Model) 

같이 내 코드 모습입니다 :

그러니까 기본적으로, 객체 계층 구조는 다음과 같이이다 Songs 컬렉션에서 상위 앨범 모델의 AlbumMetadata가 업데이트 될 때. 이벤트를 통해 어떻게합니까?

어떻게 AlbumMetadata 개체에서 이벤트를 발생시키고 Songset Collection의 SongMetadata 모델에서 해당 이벤트를 구독합니까?

답변

0

당신이 할 수있는 등 :

var MusicBrowser = MusicBrowser || {}; 

MusicBrowser.SongMetadata = Backbone.Model.extend({ 
    initialize: function() { 
     this.fetch(); 
    } 

}); 

MusicBrowser.AlbumMetadata = Backbone.Model.extend({ 
    initialize: function() { 
     this.fetch(); 
    } 
}); 

MusicBrowser.Song = Backbone.Model.extend({ 
    initialize: function() { 
     var songMetadata = new MusicBrowser.SongMetadata({ albumId: this.collection.albumId, songId: this.get("Id") }); 
     this.set("metadata", songMetadata); 

     this.bind('albumMetadata', function(albumMetadata) { 
      // here you have the albumMetadata and the songMetadata 
     }); 
    } 
}); 

MusicBrowser.Songs = Backbone.Collection.extend({ 
    model: BundleBrowser.Song, 
    initialize: function (models, options) { 
     this.albumId = options.albumId; 
     this.fetch(); 

     this.bind('albumMetadata', function(albumMetadata) { 
      _.each(this.models, function(model) { 
       model.trigger('albumMetadata', albumMetadata); 
      }); 
     }); 
    } 
}); 

MusicBrowser.Album = Backbone.Model.extend({ 

    initialize: function() { 
     var songs = new MusicBrowser.Songs([], { albumId: this.get('Id') }); 
     this.set('songs', songs); 

     var albumMetadata = new MusicBrowser.AlbumMetadata({ albumId: this.get('Id') }); 
     this.set("metadata", albumMetadata); 
     albumMetadata.bind('change', function() { songs.trigger('albumMetadata', this); }, albumMetadata); 
    } 
}); 

MusicBrowser.Albums = Backbone.Collection.extend({ 
    model: MusicBrowser.Album, 
    initialize: function() { 
     this.fetch(); 
    } 
}); 
관련 문제