1

foob​​ar2000 音楽プレーヤー用の WSH コンポーネントで jscript インターフェイスを構築しようとしています。
ある時点で、それぞれが同じ関数を呼び出す可変数のボタンを作成する必要がありますが、異なる引数を使用します。for ループarrayを使用して、ボタンを作成できます。ただし、すべてのボタンは最後のボタンの引数のみを渡します。

ボタンを追加するために使用するコードは次のとおりです。

for (var i=0; i<_groupsArray.length; i++) {
    _btn = _groupsArray[i];
    ƒview.addButton(_btn, _img, function () {setView(_btn)}, function () {doPlay(_btn)});
}  

この場合、_btn は、ボタン ラベルと、ボタンをクリックしたときに関数に渡す引数の両方として使用されます (アーティスト名、アルバム タイトルなどになります)。ƒviewは、ボタンを保持するカスタム オブジェクトです。ボタンの位置を指定する必要がないように作成しました。ƒviewは必要なときにいつでもそれらを計算します。
これは、実際にボタンを作成する addButton メソッドの一部です (残りはレイアウトを計算します)。各アクション引数は、addButton メソッドによる処理なしで、作成中のボタンにパラメーターとして渡されます。

this.addButton = function(label, img, action1, action2, action3, action4, action5) {
    ...
    new ButtonObject(label, __x, __y, __w, __h, action1, action2, action3, action4, action5);

最後に、これを buttonObject コンストラクターに持っています:

function ButtonObject(label, x, y, w, h, action1, action2, action3, action4, action5) {
    ...
    this.action1 = action1;
    this.action2 = action2;
    this.action3 = action3;
    this.action4 = action4;
    this.action5 = action5;
    ...
    this.act1 = function () {
        var __doIt = function () {this.action1();};
        return __doIt;
    }

for ループ中に渡された関数は、最終的に action1、action2 ... プロパティとしてオブジェクトに格納されます。this.action1()を直接呼び出すなど、 act1 メソッドでaction1
を呼び出すさまざまな方法を試しました。this.action1.apply()の使用; 上記のように節を形成しようとしています。正しいアクションを呼び出しますが、最後に作成されたボタンの引数を使用するか、クラッシュするか、効果がありません。

私は今、試すアイデアがありません。関数と引数を別々に渡すことで部分的に成功しましたが、それは醜いトリックです。私は節とそれらがローカル変数を存続させる方法に関する多くのチュートリアルを読みましたが、この場合、私はまだそれらをうまく機能させることができませんでした. 「このオブジェクトはこのプロパティまたはメソッドを処理しません」という行を指しているボタンをクリックすると、最後の試行 (コードで確認できるように) がクラッシュします。

var __doIt = function () {this.action1();};

では、各ボタン内で引数を「有効」に保つにはどうすればよいでしょうか。

4

1 に答える 1

1

次のようなものを試してください:

for (var i=0; i<_groupsArray.length; i++) {
    _btn = _groupsArray[i];
    ƒview.addButton(_btn, _img,
        function(b) {return function () {setView(b)};}(_btn),
        function(b) {return function () {doPlay(b)};}(_btn)
    );
}

_btn へのバインディングだけでなく、その値を保持するクロージャを作成する必要があります。追加のラッパー関数はまさにそれを行います。

于 2012-06-22T19:55:56.803 に答える