Angular: как запустить функцию, только если данные извлекаются асинхронно? - PullRequest
0 голосов
/ 20 мая 2018

У меня есть два файла:

index.html: , которые я хочу использовать пользовательская директива in:

<body>   
    <div ng-controller="friendsController">
        <random-friend friends="friends" title="'Random Friend'"></random-friend>
    </div>
</body>

app.js: , который содержит:

  • контроллер: имеет $scope.friends, которому присвоено его значение асинхронно , и будет использоваться впользовательская директива.
  • пользовательская директива , которая выводит случайного друга (элемента) при каждой загрузке страницы.

Код:

// Module
const myApp = angular.module('myApp', []); 

// Custom Directive
myApp.directive('randomFriend', [function() {
    return {
        restrict: 'E',
        scope: {
            friends: '=',
            title: '='
        }, 
        template: `<h4>{{friends[randomIndex]}}</h4>`,
        controller: function generateRandomNumber($scope) {
            $scope.randomIndex = Math.floor(Math.random() * $scope.friends.length); // TypeError: Cannot read property 'length' of undefined
        }
    };
}]);

// Controller 
myApp.controller('friendsController', ['$scope', $scope => {
    $http.get('data/friends.json').then(function(response) {
        $scope.friends = response.data;
    });
}]);

Проблема в том, что когда код достигает значения $scope.friends.length, консоль возвращает сообщение об ошибке «TypeError: Невозможно прочитать свойство« длина »из неопределенного», поскольку данные запроса еще не получены.
Итак, как запуститьфункция generateRandomNumber() только при извлечении массива друзей?

1 Ответ

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

Вы можете справиться с этим, используя ng-if

 <div ng-controller="friendsController">
  <div ng-if="friends.length > 0">
        <random-friend friends="friends" title="'Random Friend'"></random-friend>
  </div>
 </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...