2016-02-07 4 views
1

моей MusicPlayer.js угловой службы имеет функцию обратного вызова, завернутую в $rootScope.$apply, который обновляет конкретный объект (musicPlayer.currentPlaybackTime) и является общей для всех других контроллеров (с помощью применения к $rootScope).

Я понимаю, что вы в идеале хотите ограничить загрязнение $rootScope, поэтому я рассматриваю возможные варианты рефакторинга, которые отвлекают вызов методов приложения до $rootScope, но позволяет моему обновленному объекту совместно использоваться несколькими контроллерами.

Мое исследование указывает на то, что я нужно зарегистрировать другие контроллеры (т.е. PlayerDashboardCtrl.js, PlaylistCtrl.js и AlbumListCtrl.js), которые нуждаются в моей currentPlaybackTime объект, но я хотел бы понять, что это наиболее эффективный способ сделать это.

спасибо.

var setSong = function(song) { 

    currentBuzzObject = new buzz.sound(song.audioUrl, { 
     formats: ['mp3'], 
     preload: true 
    }); 

    currentBuzzObject.bind('timeupdate', function() { 
     $rootScope.$apply(function() { 
      musicPlayer.currentPlaybackTime = currentBuzzObject.getTime(); 
     }); 
    }); 

    musicPlayer.currentSong = song; 
}; 

ответ

1

Лучший способ обмена данными между контроллерами, чтобы сделать service/factory и получить данные, используя эти услуги из любого контроллера вы хотите. Вам понадобится inject этот сервис во всех контроллерах, к которым вы хотите получить к ним доступ.

Этот умник видео даст вам четкое понимание: Share data between controllers

StackOverflow вопрос подобный этому: Stackoverflow answers to sharing data between controllers.

Демо: Fiddle to show data sharing.

Смежные вопросы