0

なぜこれがうまくいかないのか教えていただけますか?(このキーワードに注意してください)

var post = {
    url: 'http://myurl.com',
    add: function() {
        window.location = this.url + '/add';
    },
    edit: function() {
        window.location = this.url + '/edit';
    }
};

コードの別の場所:

post.url = '<?php echo BASE_ADMIN . $postType ?>';

$(document).ready(function() {

    $("#listing").aJqueryPlugin({
    ...
    // Buttons and their callbacks
    buttons : [
        {name: 'Add', bclass: 'add', onpress : post.add},
        {name: 'Edit', bclass: 'edit', onpress : post.edit},
    ],
   ...
});

この線

post.url = ....

期待どおりに動作します。posturlプロパティが更新されました。

ただし、[追加]または[編集]ボタンをクリックしてそれらの関数を入力すると、this.url投稿オブジェクトではなくボタンを参照するため未定義です。なんで?コールバックからurlプロパティを参照するにはどうすればよいですか?

4

1 に答える 1

2

jQueryを使用しているので、使用できます$.proxy

    {name: 'Add', bclass: 'add', onpress : $.proxy(post, "add")},
    {name: 'Edit', bclass: 'edit', onpress : $.proxy(post, "edit")},

これは、文字列で指定されたオブジェクトのメソッドを呼び出す新しい関数を返します。


効果的にこれを行っています:

{name: 'Add', bclass: 'add', onpress : function() {
                                           return post["add"].apply(post, arguments);
                                       },
{name: 'Edit', bclass: 'edit', onpress : function() {
                                           return post["edit"].apply(post, arguments);
                                         },

関数内の の値はthis、関数が呼び出された方法に依存するため、正しい値を取得するには別の手段が必要になる場合があります。


this常にそのオブジェクトを参照したいことがわかっている限り、これらを元のオブジェクトに設定することもできます。

var post = {
    url: 'http://myurl.com'
};
post.add = $.proxy(function() {
    window.location = this.url + '/add';
}, post);
post.edit = $.proxy(function() {
    window.location = this.url + '/edit';
}, post);

$.proxyこれは、関数の直後に目的の値を渡すことができるの別の署名を使用しthisます。

于 2012-11-29T20:13:17.160 に答える