2016-11-01 3 views
0

Мой код работает, но если я звоню в html, это не работает, я не понимаю. , если я позвоню в HTML это дает мне ошибкуUncaught TypeError: Request.callPost не является функцией?

Uncaught TypeError: Request.call Post is not a function

почему?

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

ответ

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, чтобы быть в глобальном масштабе, это сделало бы трюк.

В качестве альтернативы рассмотрите вместо этого ссылку на ваш обработчик click в пределах области, где Request доступен. Что-то вроде этого:

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

     var Request = /.../; 

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

    }); 
})(jQuery); 

// no need to use 'Request' here 

Есть вероятно некоторые изменения вы должны сделать на основе структуры кода за пределами того, что попросили в этом вопросе, но принцип в этом случае должен иметь смысл. Вместо того, чтобы иметь код в глобальной области видимости (встроенный обработчик HTML в вашем случае), попробуйте получить доступ к коду в узкой области, переверните его и получите код в узкой области доступа к объектам глобальной области действия (элемент HTML в вашем случае) ,

Поскольку сложность кода возрастает, и тестируемость становится более важной, вы должны полностью абстрагироваться от глобального объекта, а предоставить его узкополосному коду, а не искать его внутри этого узкоколейного кода. Но мы могли бы потратить часы на такие вещи, и я думаю, что это хорошо за пределами того, что здесь задают.

По существу, вы пытаетесь получить доступ к чему-то в узком пространстве. И немедленное решение будет заключаться в том, чтобы либо перевести что-то в большую область действия, либо изменить то, как вы структурируете свой код, чтобы вам не приходилось обращаться к нему в первую очередь. Первый - это более быстрый подход для всего кода, который вы показываете, последний более чист.

Смежные вопросы