4

私は次のコードを持っています:

for (_field in _fields) {
    $.post(
        '/api/fields',
        { id: _field.id },
        function(data, _field) {
            alert(data);
        } (data, _fields[_field)
    );
}

_fields[_field]ループ中に適切なオブジェクトへの参照が失われるため、jQueryからデータを返す関数に要素を渡す必要があります。問題は、post関数にパラメーターが必要であることを定義する際に_field、データのパラメーターも指定する必要があることです。そうしないと、データがで上書きされ_fieldます。

undefined現在、ループ内にデータオブジェクトが定義されていないため、データが返されます。私も渡してみましたがnull、それでも戻りますnull。post関数から返されたデータを上書きせずに要素を渡す方法を探しています。

これを修正する方法はありますか、それとも必要なことを実行できる代替のjQueryメソッドがありますか?

4

1 に答える 1

7

関数ファクトリ関数—関数を作成する関数が必要です。

for (_fieldName in _fields) {
    $.post('/api/fields',
    {
        // Unrelated, but I think this bit is wrong; shouldn't it be
        // `id: _fields[_fieldName].id` ? You're trying to use `.id` on
        // a string -- see below for a full update
        id: _fieldName.id
    },
    makeHandler(_fields[_fieldName])
    );
}
function makeHandler(field) {
    return function(data) {
        // Use `data` and `field` here
    };
}

に渡すオブジェクト初期化子では、それを呼び出して実行し、次に渡す関数を返すことに注意して$.postください。その関数は、完了時に呼び出され、引数を含むへの呼び出しのコンテキストに対するクロージャであるため、それを与える引数とへの引数にアクセスできます。詳細:閉鎖は複雑ではありません makeHandler$.post$.postdata$.postfieldmakeHandlermakeHandlerfield


上記のコードでは、変数_field_fieldNameより明確にするために変更したことに注意してください。for..inループ内の変数は文字列であり、プロパティの名前です。.idコメントもご覧ください。間違った場所で使用しようとしていたと思います。これがあなたが本当に望んでいたと私が思うものです:

for (_fieldName in _fields) {
    _field = _fields[_fieldName];
    $.post('/api/fields',
    {
        id: _field.id
    },
    makeHandler(_field)
    );
}
function makeHandler(field) {
    return function(data) {
        // Use `data` and `field` here
    };
}

また_fields、が配列の場合は、for..inセーフガードなしで使用しないでください。詳細:神話と現実for..in

于 2012-04-16T08:52:49.640 に答える