【问题标题】:Using lodash array functions on Restangular collections在 Restangular 集合上使用 lodash 数组函数
【发布时间】:2013-09-24 18:56:30
【问题描述】:

我正在使用带有 AngularJS 的 Restangular,我想在控制器的一个函数中迭代一个集合,我需要修改一个由 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 是一个promise,而不是一个实际的数组,所以_.forEach 尝试迭代promise 的属性而不是对象。我得到与angular.forEach 相同的结果。

如何迭代 Restangular 资源集合?我也想访问lodash的所有收集功能,比如_.filter

【问题讨论】:

  • 不要将 forEach 用于副作用以外的其他事情。在这里使用 map()。

标签: javascript angularjs restangular lodash


【解决方案1】:

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) { ... });
};

【讨论】:

  • 但是请求完成后如何修改列表呢?
【解决方案2】:

试试这个:

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

【讨论】:

  • 这表现不同:toggleOrder 在所有订单返回后立即被调用。我的目标是让按钮在点击的订单上调用 toggleOrder 方法。
【解决方案3】:

即使接受的答案解决了对数组和承诺的误解,问题仍然存在......

_.forEach 可以,但_.filter 不行。 Lodash 剥离了 Restangular 收集方法。

确实

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

结果

日志:函数(){...}

日志:未定义

如何完成一个保留 Restangular 方法的过滤器?

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2020-08-27
    相关资源
    最近更新 更多