anguarl1 ng-repeat для элементов, возвращаемых async у родителей ng-init - PullRequest
0 голосов
/ 21 мая 2018

Я стараюсь иметь <ng-repeat> для элементов, которые возвращаются в родительских элементах 'ng-init.Я чувствую, что асинхронная природа инициализации ng-init этого массива приводит к тому, что ng-repeat не рендерится.Вот мои настройки HTML / angular

<span ng-click=\"showArtist(song.artist.key)\" class=\"song_alias\" 
ng-init=\"collabSongs = getSongsFromCollab(song.collaboration_id); \" >
   {{song.artist.alias}}
   <span ng-repeat=\"songItem in collabSongs\" 
     ng-init=\"songCollabItem = songForKey(songItem); index = $index\">
      {{index != (collabSongs.length - 1) ? songCollabItem.artist.alias : 'goo'}}
   </span>
</span>

, однако, хотя я выхожу из системы, что getSongsFromCollab() правильно возвращает массив ненулевых элементов (2), хотя и асинхронно, я не видел внутреннее <span> когда-либо визуализируется в dom и вместо этого просто смотрите:

<!-- ngRepeat: songItem in collabSongs -->

, для справки здесь есть вызывающая функция firebase, которая заполняет collabSongs в родительской ng-init

    $scope.getSongsFromCollab = function(collaboration) {
  console.log('getSongs' , collaboration);
  var songsRef =  new Firebase(FBURL + 'collaboration_songs').child(collaboration).child('songs');
  songsRef.once("value", function(data){
      var val = data.val();
      var array_of_songs = [];
      var keys = Object.keys(val);
      for (var i= 0; i<keys.length; i++){
        array_of_songs.push(val[keys[i]]);
      }
      console.log(array_of_songs);
      return array_of_songs;
  });

};

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

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

collabSongs устанавливается на возвращаемое значение getSongsFromCollab, которое не является возвращаемым значением функции обратного вызова на songsRef.once.Вы пытаетесь синхронно установить значение, возвращаемое асинхронной функцией.$ firebaseArray синхронно возвращает массив, который позже заполняется данными.

0 голосов
/ 21 мая 2018

Я думаю, что могу просто сделать следующее

   $scope.getSongsFromCollab = function(collaboration) {
    var songsRef =  new Firebase(FBURL + 'collaboration_songs').child(collaboration).child('songs');
    return $firebaseArray(songsRef);
};

angularfire делает магию для связывания асинхронных объектов, возвращаемых из firebase с angular.Любое объяснение, которое я хотел бы услышать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...