未捕获的TypeError:Request.callPost不是函数?

时间:2016-11-01 17:17:21

标签: jquery ajax

我的代码可以使用,但是如果我用html调用它不起作用,我就不明白了。 如果我用html调用它会给我错误

  

未捕获的TypeError:Request.call Post不是函数

为什么呢?

<button onclick="Request.callPost('/Api/Page/start/','mypost')" >My button</button>
<br> <br><br>
(function($){   
$(document).ready(function(){

    var Request={
        init:function(){

            this.callPost('/Api/Page/all','data'); //ok it work 
        },
        callPost:function(link,data){
            $.ajax({
                url:link,
                type:'POST',
                data:data,
                dataType:'json',
                success:function(response){
                    console.log(response);
                    return response;
                }
            });
        },
        callGet:function(link,data){
            $.ajax({
                url:link,
                type:'GET',
                data:data,
                dataType:'json',
                success:function(response){
                    return response;
                }
            });
        },
    }

    Request.init();
})
})(jQuery);

1 个答案:

答案 0 :(得分:0)

为简化起见,您的代码结构如下:

(function($){
    $(document).ready(function(){

        var Request = 'something';

    });
})(jQuery);

// trying to use 'Request' here

您不能在全局范围内使用Request,因为它在全局范围内不存在。它仅存在于您传递给function函数的ready()内,该函数也发生在另一个匿名函数中。这些函数之外的任何内容都无法看到该变量。

如果您需要您的变量存在于全局范围内,您可以在那里声明:

var Request;

(function($){
    $(document).ready(function(){

        Request = 'something';

    });
})(jQuery);

// you can use 'Request' here

请小心这种方法,因为您通常不希望在遇到错误时只将所有内容移动到全局范围。这是您想要习惯使用的金锤。如果您需要 Request处于全局范围内,那么这就行了。

作为替代方案,请考虑将点击处理程序附加到Request可用的范围。像这样:

(function($){
    $(document).ready(function(){

        var Request = /.../;

        $('#yourButton').click(Request.callPost('/Api/Page/start/','mypost'));

    });
})(jQuery);

// no need to use 'Request' here

根据您在此问题中提出的问题之外的代码结构,可能您必须做出一些更改,但在这种情况下原则应该使感。而不是在全局范围内使用代码(在您的情况下为HTML内联处理程序)尝试访问狭窄范围内的代码,翻转并使窄范围内的代码访问全局范围内的对象(在您的情况下为HTML元素)

随着代码复杂性的增加和可测试性变得越来越重要,您将需要完全抽象全局对象并提供给窄带代码,而不是从窄范围内寻找它码。但我们可能花费数小时进入这类事情,我认为这远远超出了这里的要求。

基本上你要做的是访问狭窄范围内的东西。而直接的解决方案是将这些内容放在更大的范围内,或者改变您构建代码的方式,这样您就不需要首先访问它。前者是一种更快速的方法,只需要显示的代码,后者更清晰。