Использование функций массива lodash в коллекциях Restangular

Я использую Restangular с AngularJS, и я хотел бы перебрать коллекцию в функции контроллера, где мне нужно изменить коллекцию, возвращаемую Restangular:

var OrderController = [ '$scope', '$http', 'Restangular',
  function($scope, $http, Restangular) {
    $scope.orders = Restangular.all('orders').getList();
    $scope.toggleOrder = function(order) {
      _.forEach($scope.orders, function(order) {
        console.log(order); // This is not an order!
        order.someProperty = false; // My goal
      });
    });
  }];

Я думаю, проблема в том, что $scope.orders — это промис, а не фактический массив, поэтому _.forEach пытается перебирать свойства промиса, а не объекты. Я получаю тот же результат с angular.forEach.

Как я могу перебирать коллекции ресурсов Restangular? Я также хотел бы иметь доступ ко всем функциям сбора lodash, таким как _.filter.


person Nicolas    schedule 24.09.2013    source источник
comment
Не используйте forEach для чего-то еще, кроме побочных эффектов. Используйте карту() здесь.   -  person PhiLho    schedule 26.11.2015


Ответы (3)


Restangular.all('orders').getList() - это промис, а не массив.

Назначьте свой список, используя $object:

$scope.orders = Restangular.all('orders').getList().$object;

Список будет пустым массивом, пока запрос не будет завершен.

ОБНОВИТЬ полный код вопроса (включая изменение заказов по запросу)

$scope.orders = [];

function modifyOrders(orders){ ... }

Restangular.all('orders').getList().then(function(orders){
 modifyOrders(orders);
 $scope.orders=orders;
});

$scope.toggleOrders = function(toggledOrder){
 _.forEach($scope.orders, function(order) { ... });
};
person blazkovicz    schedule 05.08.2014
comment
Но как я могу изменить список после завершения запроса? - person Nicolas; 06.08.2014

Попробуй это :

var OrderController = [ '$scope', '$http', 'Restangular',
  function($scope, $http, Restangular) {

    $scope.toggleOrder = 
        Restangular.all('orders').getList().then(function(orders){
            _.forEach(orders, function(order) {
                console.log(order); // This is not an order!
                order.someProperty = false; // My goal
            });
        });
  }];

После метода getList() вы получаете обещание, которое принимает список в параметре.

Из документов: https://github.com/mgonto/restangular#using-self-reference-resources

person Thomas Pons    schedule 24.09.2013
comment
Это ведет себя по-другому: toggleOrder вызывается для всех ордеров сразу после их возврата. Моя цель состояла в том, чтобы кнопка вызывала метод toggleOrder для выбранного заказа. - person Nicolas; 05.06.2014

Даже если принятый ответ разрешил недоразумение с массивами и промисами, проблема остается...

_.forEach можно, а _.filter нет. Полосы Lodash. Методы сбора прямоугольных материалов.

Конечно

api.getList().then(function(items) {
  console.log(items.getRestangularUrl);
  items = _.filter(items, function() { return true; });
  console.log(items.getRestangularUrl);
));

приводит к

журнал: функция () {...}

журнал: не определено

Как выполнить фильтр, сохраняющий методы Restangular?

person Cyril CHAPON    schedule 06.10.2015