【问题标题】:AngularJS - tweaking data retrieved from serviceAngularJS - 调整从服务中检索到的数据
【发布时间】:2015-07-17 01:35:29
【问题描述】:

我有一个检索数组中对象的服务。

appServices.factory('FooService', ['$resource', function ($resource) {
    var resource = $resource('/api/user/:username/foos/:id', {username: '@username'}, {
        delete: { method: 'DELETE', params: {id: '@id'} },
        get: { method: 'GET', params: {id: '@id'} },
        foosOfTheWeek: {method: 'GET', params: {dateFrom: '@dateFrom', dateTo: '@dateTo'}, isArray: true}
    });
    return resource;
}]);

假设每个 foo 都是这样的:

{ id: 2, date: '2015-05-13', attr1: "bar1", attr2: "hello" }

我需要将“foosOfTheWeek”返回的 foos 包含在不同的对象数组中,如下所示:

[
    {date:'2015-05-10', foos: [ { id: 2, date: '2015-05-10', attr1: "bar1", attr2: "hello1" } ]}, 
    {date:'2015-05-11', foos: []}, 
    {date:'2015-05-12', foos: [ { id: 3, date: '2015-05-12', attr1: "bar2", attr2: "hello2" }, { id: 4, date: '2015-05-12', attr1: "bar3", attr2: "hello3" } ]}, 
    {date:'2015-05-13', foos: []}, 
    {date:'2015-05-14', foos: []}, 
    {date:'2015-05-15', foos: []}, 
    {date:'2015-05-16', foos: []}, 
]   

我有一个进行这种转换的函数,但如果我从这样的控制器调用它,我不知道如何让我的服务返回最后一个数组:

FooService.<FunctionForLastArray>()

编辑:

我已经尝试过这种方法,它返回我想要的列表,但我不确定这是否是解决它的最佳方法,因为我自己返回列表而不是承诺。

在我的服务声明中我添加了:

  • 返回对象列表的函数:{ date: &lt;dateValue&gt;, foos: &lt;listOfFoos&gt; }
  • 返回资源中的函数。

所以基本上我从控制器调用它为:

FooCtrl.foosByWeek = FooService.foosOfTheWeek(filters);

其中 filters 是一个有一些约束(dateFrom、dateTo、user)的对象

resource.foosOfTheWeek = function (filters){
    var days = getDaysOfTheWeek(filters.dateFrom, filters.dateTo);
    this.foosOfTheWeek(filters, function(data){
        for (var i = 0; i < data.length; i++){
            var i = moment(data[i].date).isoWeekday() - 1;
            days[indexDay].foos.push(data[i]); // put the foo in the proper day
        }
    });
    return days;
};

提前致谢!

【问题讨论】:

    标签: angularjs service angular-promise ngresource


    【解决方案1】:

    以下将数据映射到显示的数组:

    var data= /*[ rest response ]*/;
    
    var tmp = {}, // temporary object ... dates as keys
        results = []; // resultant array
    // loop over data and organize in temp object
    data.forEach(function(row){
        if(!tmp[row.date]){
           tmp[row.date]=[]; 
        }
         tmp[row.date].push(row);
    });
    // loop over temp object to create final array elements
    for(key in tmp){
        results.push({date: key, foos:tmp[key]});  
    }
    

    可以在 $resource 的 transformResponse 回调中使用它,尽管我怀疑您在使用 $save() 之类的方法时会遇到问题,并且需要将对象传递到 $resource 以进行更新

    DEMO

    【讨论】:

    • 感谢您的提示!我的主要问题是找到一种方法从服务功能的控制器中获取结果(就像查询,保存)我正在考虑将此服务注入另一个服务(我们称之为“BarService”),然后注入两者它们在控制器中,所以我可以拥有 FooService 的功能以及以我需要的方式获得结果的查询,但我想这不是实现我想要的最佳方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多