为什么在资源查询转换中未定义数据变量

Jas*_*son 5 angularjs angular-resource

我很有棱角......所以我确信我做错了.花了好几个小时试图寻找一个解决方案,但angularjs文档旁边是无用的......几乎所有的例子都试图在全球范围内设置它.

我试图传递一个复杂的javascript对象作为查询参数.该对象有一个属性是一个数组,因此我需要展平(正确的术语??)这个对象,以便MVC绑定可以正确地实例化模型.

我试图传递的对象是沿袭的

newRequest = {
   SearchTerms: 'error',
   PageSize: 25,
   ...
   Facets: [
       { Field: 'createdBy', Value: 'Joe' },
       { Field: 'createdBy', Value: 'Mary' }
   ]
}
Run Code Online (Sandbox Code Playgroud)

我宣布我的资源如下

(function () {
    "use strict";

    angular
        .module('common.services')
        .factory('searchResource', ['$resource', 'appSettings', searchResource]);

    function searchResource($resource, appSettings) {
        return $resource(appSettings.searchPath, null, {
            query: {
                method: 'GET',
                transformRequest: function (data, headersGetter) {
                    if (data === undefined) {   // this is always true
                        return data;
                    }

                    return $.param(data);
                }
            }
        });
    }
}());
Run Code Online (Sandbox Code Playgroud)

我正在使用它

vm.executeSearch = function () {
    searchResource.query(
        newRequest,
        function (data) {
            vm.response = data;
            vm.request = data.Request;
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

transformRequest功能被称为...并headersGetter具有价值.

附加信息

正如所建议的那样,我改变了方向,而不是使用我通过工厂提供服务的资源.结果相同...... data参数未定义.这是新代码.

(function () {
    "use strict";

    angular
        .module('common.services')
        .factory('searchProvider', ['$http', 'appSettings', searchProvider]);

    function searchProvider($http, appSettings) {
        return {
            query: function (request, callback) {
                $http({
                    url: appSettings.searchPath,
                    method: 'GET',
                    params: request,
                    transformRequest: function (data, headersGetter) {
                        if (data == undefined) {
                            return data;
                        }

                        return $.param(data);
                    }
                })
                .success(function (data) {
                    callback(data);
                });
            }
        }
    }


}());

searchProvider.query(
    newRequest,
    function (data) {
        console.log(data);

        vm.response = data;
        vm.request = data.Request;
    }
);
Run Code Online (Sandbox Code Playgroud)

但问题dataundefined!我知道该newRequest对象是有效的,因为呼叫消失了.只是有一个格式不正确的网址.我哪里做错了?

sir*_*cco 3

问题是它是一个 GET 请求,而 ngResource 不会接受dataGET 请求:

请参阅https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L526

var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method);

用于hasBody判断是否设置该data参数。

因此,此时您最好的选择是改用 $http,因为 ngResource 用于更 RESTful 的 api,或者将您的 API 切换为 POST 而不是 GET。

编辑

if (data === undefined) 还有一件事:当你可以这样做时,你不需要使用: if(!data),这意味着同样的事情。

Javascript 真实性:https://developer.mozilla.org/en-US/docs/Glossary/Truthy

回复附加信息

您的数据仍然未定义,因为您没有将数据设置为任何内容,而是设置了参数。但是一旦您到达这里,您就不需要转换请求。

你可以这样做

$http({
  ...
  params: $.param(request),
  ...
})
Run Code Online (Sandbox Code Playgroud)