获取 transformRequest 中的参数

Get parameter in transformRequest

我将 REST 服务器 API 与 angular $资源一起使用。我无法控制服务器 API。服务器 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中的参数。有没有办法获取参数或其他方法来解决我的问题?

您需要一个包装函数来将参数解析为该对象。看看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);
                        }
                    }
                }
            );
        }
    });
})();

我根据林斯的回答找到了我的解决方案(谢谢!)。我根据返回函数的参数设置 $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);
                    }
                }
            });
        }
    });
})();