Задать вопрос
@krekerov
Fullstack ninja

Как использовать данные от фабрики в ангуляр?

Приветствую.
есть следующий код внутри контроллера
$scope.billings = Billing.query();

$scope.getTotalAmount = function(index){
//тут посложнее логика
            return $scope.billings[index].bills;
        }

При вызове на страничке getTotalAmount() появляется ошибка:
Can't interpolate: 
                                            {{getTotalAmount()}}
                                            
TypeError: Cannot read property 'bills' of undefined

Очевидно данные не успели придти, а уже запрашиваются.
Предполагаю что нужны promises, но не получается их использовать.
ПРобовал также .then и $watch, тоже вылазят разные ошибки.
направьте, пожалста.
  • Вопрос задан
  • 2275 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Если использовать promises, то можно сделать так:
$scope.getTotalAmount = function(index){
    //тут посложнее логика
    if(!$scope.billings.$resolved)
        return 0;
    return $scope.billings[index].bills;
}

Но это не поможет, если произошла ошибка в ходе запроса (promise rejected).

Можно сделать так:
$scope.getTotalAmount = function(index){
    //тут посложнее логика
    if(!$scope.billings[index])
        return 0;
    return $scope.billings[index].bills;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
У Вас getTotalAmount есть function(index)

Объясню. getTotalAmount при вызове ожидает что вы передадите ей index, по которому она сможет вернуть Вам $scope.billings[index].bills. Если Вы во вью не передаете index вызывая просто {{getTotalAmount}} вместо {{getTotalAmount(2 или любой индекс по которому можно будет получить вот это Ваше $scope.billings[index].bills)}} естественно получите ошибку, так как index в Вашем случае undefined, а $scope.billings[undefined] сам бог велел быть undefined при таких входящих. Ну не умеет js вообще, и angular в частности угадывать какие именно данные по внешним приблизительным признакам Вы ожидаете.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы