加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 06:47:58 所属栏目:安全 来源:网络整理
导读:我很有棱角……所以我确信我做错了.花了好几个小时试图寻找一个解决方案,但 angularjs文档旁边是无用的……几乎所有的例子都试图在全球范围内设置它. 我试图传递一个复杂的javascript对象作为查询参数.该对象有一个属性是一个数组,因此我需要展平(正确的术语
我很有棱角……所以我确信我做错了.花了好几个小时试图寻找一个解决方案,但 angularjs文档旁边是无用的……几乎所有的例子都试图在全球范围内设置它.

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

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

newRequest = {
   SearchTerms: 'error',PageSize: 25,...
   Facets: [
       { Field: 'createdBy',Value: 'Joe' },{ Field: 'createdBy',Value: 'Mary' }
   ]
}

我宣布我的资源如下

(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);
                }
            }
        });
    }
}());

我正在使用它

vm.executeSearch = function () {
    searchResource.query(
        newRequest,function (data) {
            vm.response = data;
            vm.request = data.Request;
        }
    );
}

正在调用transformRequest函数…而headersGetter有一个值.

附加信息

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

(function () {
    "use strict";

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

    function searchProvider($http,appSettings) {
        return {
            query: function (request,callback) {
                $http({
                    url: appSettings.searchPath,method: 'GET',params: request,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;
    }
);

但问题是数据未定义!我知道newRequest对象是有效的,因为调用已经结束.只是有一个格式不正确的网址.我哪里做错了?

解决方法

问题是它是一个GET请求,ngResource不接受GET请求中的数据:

见https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L526

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

它使用hasBody来确定是否设置数据参数.

所以在这一点上你最好的选择是转向使用$http,因为ngResource用于更多RESTful api或将你的API切换到POST而不是GET.

编辑

还有一件事:你不需要使用if(data === undefined)
当你能做到:if(!data)意味着同样的事情.

Javascript pututhiness:https://developer.mozilla.org/en-US/docs/Glossary/Truthy

回复其他信息

您仍然未对数据进行定义,因为您没有将数据设置为任何内容,而是设置了参数.但是一旦你在这里,你就不需要改变请求了.

你可以这样做

$http({
  ...
  params: $.param(request),...
})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读