在transformRequest

时间:2015-05-21 11:11:43

标签: angularjs android-resources

我使用带有角$资源的REST服务器API。我无法控制Server API。 Server API要求列表项具有属性ItemTyp,其中列表名称附加了Item。哪个是冗余信息

我想为多个列表使用相同的资源而不是。我试过以下:

(function () {
    'use strict';

    angular.module('mod', ['ngResource']);

    angular.module('mod').controller('Controller', function (ListItem) {
        var listItem1 = new ListItem({ a: 1 });
        listItem1.$save();

        var listItem2 = new ListItem({ b: 2 });
        listItem2.$save({ listName: 'list2' });
    });

    angular.module('mod').factory('ListItem', function ($resource) {
        return $resource('/_api/lists/:listName/:Id', { listName: 'list1', Id: '@Id' },
            {
                save: {
                    method: 'POST',
                    transformRequest: function (data) {
                        //data.ItemTyp = listName + "Item";
                        return angular.toJson(data);
                    }
                }
            });
    });
})();

但我发现无法在transformRequest中获取参数。有没有办法让params或其他方法来解决我的问题?

2 个答案:

答案 0 :(得分:1)

您需要一个包装函数来将参数解析为该对象。看看someData。顺便说一句。您不需要创建像new ListItem()这样的新对象。

(function () {
    'use strict';

    angular.module('mod', ['ngResource']);

    angular.module('mod').controller('Controller', function (ListItem) {
        ListItem({ data: 'test'}).save({Id: 3, listName: 'testName'});
        ListItem({ data: 'test'}).save({Id: 4, listName: ''});
    });

    angular.module('mod').factory('ListItem', function ($resource) {
        return function (someData) {
            return $resource('/_api/lists/:listName/:Id',  { 
                    listName: '@listName', 
                    Id: '@Id' 
                }, {
                    save: {
                        method: 'POST',
                        transformRequest: function (data) {
                            //data.ItemTyp = listName + "Item";
                            console.log(someData);
                            return angular.toJson(data);
                        }
                    }
                }
            );
        }
    });
})();

答案 1 :(得分:1)

我发现我的解决方案基于lins回答(谢谢!)。我根据返回函数的参数设置$ resource的defaultParams。在完整代码中,{a:1}和{b:2}来自模型,因此添加listName会感觉很脏。

(function () {
    'use strict';

    angular.module('mod', ['ngResource']);

    angular.module('mod').controller('Controller', function (ListItem) {
        ListItem({ listName: 'testName' }).save({ a: 1 });
        ListItem().save({ b: 2 });
    });

    angular.module('mod').factory('ListItem', function ($resource) {
        return function (params) {
            var defaultParams = {
                Id: '@Id',
                listName: 'test'
            }
            if (params) {
                angular.forEach(params, function (v, k) {
                    defaultParams[k] = v;
                });
            }
            return $resource('/_api/lists/:listName/:Id', defaultParams, {
                save: {
                    method: 'POST',
                    transformRequest: function (data) {
                        data.ItemTyp = defaultParams.listName + "Item";
                        return angular.toJson(data);
                    }
                }
            });
        }
    });
})();