簡體   English   中英

類中的JavaScript回調失去綁定

[英]Javascript callback within class loses binding

我的類遇到問題,我將回調函數設置為在ajax請求后觸發,除了回調然后具有this =窗口而不是this =調用類之外,此方法工作正常。 我嘗試擺弄綁定等都無濟於事。 任何幫助表示贊賞。

<?php
if (isset($_POST['id'])){
    echo json_encode(array('key' => 'val'));
    die;
}
?>
<script type="text/javascript" src="/linkup/js/mootools-core-1.4.3-full-compat-yc.js" charset="utf-8"></script>
    <script type="text/javascript" src="/linkup/js/mootools-more-1.4.0.1.js" charset="utf-8"></script><script>
var myClass = new Class({
    blah: function(){
        console.log('this worked ok');
    },
    foo: function(){
        this.blah(); // at this point it is failing with "unknown function"
    },
    bar: function(){
        this.reqJSON({id:1,req:'grabpoints'},this.foo);
    },
    // data - an aray containing some data to post {id:1,req:'grabpoints'}
    // onS - a function to fire on return of data
    reqJSON: function(data,onS){
        if (this.jsonRequest) this.jsonRequest.cancel();
        this.jsonRequest = new Request.JSON({
                url: 'test.php',
                onRequest: function (object){
                    console.log('sending json');
                },
                onSuccess: function (object){
                    console.log('json success');
                    onS(object);
                }
            }
        ).post(data);
    },

});
var o = new myClass();
o.bar();

this絕不是函數的繼承范圍(即閉包)的一部分,而是由函數onS(object)在調用函數時確定的。 以這種方式調用的功能就是那個功能。 您需要調用this.onS(object) ,但這在您的情況下不起作用,因為onSuccess函數也不知道this

要撥打與最外層的對象作為富/ ONS功能this必須參考保存到它在另一個變量,通常被稱為that

reqJSON: function(data,onS){
    var that = this;
    ...

    onSuccess: function (object){
        console.log('json success');
        that.onS(object);
    }

改變這個

bar: function(){
    this.reqJSON({id:1,req:'grabpoints'},this.foo);
}

至 :

bar: function(){
  var self = this;
  this.reqJSON({id:1,req:'grabpoints'},self.foo);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM