Как перезагрузить вызов angularJS контроллера с фабрики, инициированной другим контроллером - PullRequest
0 голосов
/ 15 ноября 2018

Я работаю над проектом angularJS, музыкальным проигрывателем, который может выбрать альбом и затем воспроизвести его из списка песен этого альбома. Все работает, за исключением того, что после воспроизведения песни из альбома (альбом A) и выбора другого альбома (альбом B), когда я пытаюсь выбрать предыдущую / следующую песню на панели проигрывателя, которая отделена от списка, воспроизводятся песни предыдущего альбома (альбом A). Понятно, что-то не обновляется. Я прочитал здесь из комментария Chev , что заводы работают только один раз. Итак, я думаю, что проблема может быть связана с моим контроллером Songplayer (с завода). Вот код:

AlbumController (контроллер с директивой):

....
$rootscope.getAlbumId = $stateParams.getAlbumId;
this.albumData = Fixtures.getAlbum();
this.songPlayer = SongPlayer;
....

FixturesController (заводская - подача музыкальных файлов):

Fixtures.getAlbum = function(){
  var chosenAlbum = $rootScope.getAlbumId
  return chosenAlbum
....
};

SongPlayerController (заводская - проигрывание музыки):

....
$rootScope.getAlbumId = $stateParams.getAlbumId;
var currentAlbum = Fixtures.getAlbum();
....
var getSongIndex = function(song){
return currentAlbum.songs.indexOf(song);
};

PlayerBarController:

code same as albumController

Похоже, PlayerBarController не регистрирует новый альбом с фабрики SongPlayer. Я исследовал и пытался использовать $ emit / $ broadcast, $ watch, различные другие обратные вызовы и т. Д. Я знаю, что ответ везде, где я искал, но у меня просто нет угловых навыков, чтобы понять это. Таким образом, любая помощь в виде простого примера кода будет принята с благодарностью. Кстати, я считаю, что мое использование $ rootScope также довольно слабое, поэтому, если у кого-то есть советы по этому поводу, я был бы признателен. Я использовал $ rootcope и $ stateparams, чтобы захватить и зарегистрировать идентификатор альбома и передать его контроллеру Fixtures.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Мне удалось заставить контроллер PlayerBar зарегистрировать новый альбом с помощью $ watch.Я просто обернул вызов, который у меня уже был, в функцию $ watch, и вуаля!

Контроллер SongPlayer:

    $rootScope.$watch('getAlbumId', function(album){
     currentAlbum = Fixtures.getAlbum();
    });
0 голосов
/ 15 ноября 2018

Я думаю, что проблема из 'this.albumData = Fixtures.getAlbum ();'Вы можете попробовать:

let albumData = Fixtures.getAlbum();
this.albumData.length = 0;
albumData.map(item => this.albumData.push(item));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...