0

重複の可能性:
javascript オブジェクト、変数プロパティ名にアクセスしますか?

特定のイベントが発生したときに、オブジェクトのメソッドをその名前で呼び出そうとしています-これが私のコードです:

var imageObject = {
    sendImage : function(obj) {
        "use strict";
        var thisId = obj.attr('id');
        var thisSubmit = obj.attr('data-submit');
        var thisCallback = obj.attr('data-callback');
        var thisUrl = $('#' + obj.attr('data-url')).text();
        new AjaxUpload(thisId, {
            action: thisUrl,
            name: 'thisfile',
            onSubmit: imageObject.thisSubmit,
            onComplete: imageObject.thisCallback
        });
    }
}

また、パラメーターを送信およびコールバック メソッドに渡したいと思います。

現時点では何も起こらず、私はそれを正しく呼んでいないと確信しています-これを達成する方法を誰か説明できますか?

submit と complete には次のものも使用しました。

onSubmit: function(file, extension) {
    imageObject.thisSubmit(file, extension);
},
onComplete: function(file, response) {
    imageObject.thisCallback(file, response);
}

しかし、私が得るのは次のようなエラーです:

imageObject.thisSubmit is not a function

属性は、オブジェクト内のメソッドの名前 (文字列) のみを格納するため、たとえば「uploadImage」になります。

4

4 に答える 4

3

TJの答えはほぼそこにありますが、(質問の新しいコードごとに)引数を から にコピーするか、 を使用してコピーする必要onSubmitthisSubmitあり.apply()ます。

以下のコードでは、後者の方法を使用しています。これにより、関数シグネチャを何度も複製する必要がなくなります。

new AjaxUpload(thisId, {
    action: thisUrl,
    name: 'thisfile',
    onSubmit: function() {
        imageObject[thisSubmit].apply(imageObject, arguments);
    },
    onComplete: function() {
        imageObject[thisCallback].apply(imageObject, arguments);
    }
});
于 2012-06-25T13:01:11.393 に答える
2

私があなたの質問を正しく理解していれば、角括弧構文を使用してプロパティにアクセスする必要があります。

new AjaxUpload(thisId, {
    action: thisUrl,
    name: 'thisfile',
    onSubmit: function () { //Anonymous function so you can pass arguments
        imageObject[thisSubmit]("myArg"); //Square brackets here
    },
    onComplete: imageObject[thisCallback] //Square brackets here (no arguments)
});
于 2012-06-25T12:46:16.103 に答える
1

thisSubmitおよびthisCallbackローカル変数は、 に存在する関数の名前であると想定していimageObjectます。

これらの文字列の名前を使用してこれらのメソッドを呼び出し、引数を渡す場合は、括弧で囲まれた構文とクロージャーの組み合わせを使用します。

var imageObject = {
    sendImage : function(obj) {
        "use strict";
        var thisId = obj.attr('id');
        var thisSubmit = obj.attr('data-submit');
        var thisCallback = obj.attr('data-callback');
        var thisUrl = $('#' + obj.attr('data-url')).text();
        new AjaxUpload(thisId, {
            action: thisUrl,
            name: 'thisfile',
            onSubmit: function() {
                imageObject[thisSubmit](arg, anotherArg, etc);
            },
            onComplete: function() {
                imageObject[thisCallback](arg, anotherArg, etc);
            }
        });
    }
    // Presumably there are more methods here, or added later...
}
于 2012-06-25T12:52:33.660 に答える
-1

calljsでどの関数を呼び出すかを使用する必要があります

onSubmit: function(file, extension) {
    imageObject.thisSubmit.call(undefined, file,extension);
},

call と apply の違いは何ですか? を参照してください。

于 2012-06-25T12:53:48.890 に答える