0

クラスに問題があり、ajaxリクエストの後にコールバック関数を起動するように設定しました。これは、コールバックを除いて正常に機能し、this=呼び出し元のクラスの代わりにthis=windowがあります。バインディングなどをいじってみましたが無駄になりました。助けていただければ幸いです。

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

4

2 に答える 2

1

this関数の継承されたスコープ(つまり、クロージャ)の一部になることはありませんが、代わりに、関数が呼び出されたときに、この場合はによって決定されonS(object)ます。このように呼ばれると、関数はまさにそれです-関数。を呼び出す必要がありますが、関数がどちらも認識していないthis.onS(object)ため、これはあなたのケースでは機能しません。onSuccessthis

最も外側のオブジェクトを使用してfoo/onS関数を呼び出すには、そのオブジェクトへの参照を別の変数(一般に:thisと呼ばれる)に保存する必要があります。that

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

    onSuccess: function (object){
        console.log('json success');
        that.onS(object);
    }
于 2012-06-29T11:17:24.763 に答える
-1

これを変える

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

に :

bar: function(){
  var self = this;
  this.reqJSON({id:1,req:'grabpoints'},self.foo);
}
于 2012-06-29T11:06:33.627 に答える