0

データベースから情報を取得し、それを という配列に格納する Ajax がありますtargetVocab。この情報はvocab、setVocab() が呼び出されたときに値を設定するために使用されます。これは最初は問題なく動作しますが、もう一度再生ボタンが押されて setVocab が 2 回目に呼び出されると、動作しません。2 回目は targetVocab が空であるように見えます。これは私の簡略化されたスクリプトです...

var targetVocab;
var vocab;
var request = new goog.net.XhrIo();

goog.events.listen(request, "complete", function(){

    if (request.isSuccess()) {
        response = request.getResponseJson();
        targetVocab = response['targetVocab'];
        setVocab(targetVocab);
    }

});

request.send("load_vocab.php");

var setVocab = function(targetVocab) {
    vocab = targetVocab;
}

var getVocab = function() {
    return vocab;
}


goog.events.listen(playAgainButton, ['mousedown', 'touchstart'], function(e) {
    getVocab();
});

更新: 私がすることは何でもvocab同様に適用されることに気づきましたtargetVocab。私の最初のアイデアはvocab、アプリ全体から要素をつなぎ合わせてからvocab、再度 に設定することで元の状態にリセットできるというものでしたtargetVocabvocabこのように2つを接続したままにせずに等しく設定する方法はありtargetVocabますか?

4

2 に答える 2

2

関数 setVocab を別の方法で定義する必要があります。

私が気付いた 2 番目のこと: 2 つの関数を 1 つの set 関数と 1 つの GET 関数をこのように記述する必要があります。

例えば

 function setVocab(targetVocab){
    vocab = targetVocab;       
}

このようにして、targetVocab を変数として実際に渡すことが保証されます。そして、それに応じて GET 関数:

 function getVocab(){
    return vocab;
}

またはそれを1つに入れます(推奨されません)

function setVocab(targetVocab){
    if(targetVocab!=""){
     vocab = targetVocab;
    }else{
     return vocab;
    }
}

コールを実装した内容に応じて

goog.events.listen(playAgainButton, ['mousedown', 'touchstart'], function(e) {
getVocab();

});

または、「推奨されない」コードを実装した場合は、これを使用します

goog.events.listen(playAgainButton, ['mousedown', 'touchstart'], function(e) {
setVocab("");

});

goog.events.listen(request, "complete", function(){

if (request.isSuccess()) {
    response = request.getResponseJson();
    targetVocab = response['targetVocab'];
    setVocab(targetVocab); //chaged here
}

});

于 2013-07-10T07:23:34.937 に答える
1

あなたの問題は、 vocab を targetVocab に設定することが原因だと思います。JavaScript では、新しい変数をオブジェクト変数の値に設定すると、両方の変数が同じオブジェクトを指します。

var a = [{a:0}];
var b = a
a.splice(0,1);
console.log(b);//=[] empty array

あなたが探しているのは、オブジェクトのクローンを作成することです。クロージャ ライブラリに goog.object.clone と goog.object.unsafeClone が見つかりました。

clone は浅いコピーのみを行うため、配列に不変オブジェクトまたはプリミティブ型が含まれる場合は clone を使用できますが、次の例のように複製された配列で何かを行う場合は unsafeClone が必要です:

var a = [{a:0}];
var b = goog.object.clone(a);
a[0].a=22;
console.log(b[0]);//=22
// b isn't even an array here so I'm not sure what clone does
//   but it doesn't do much
console.log(b instanceof Array);//false

配列の項目の値を決して変更せず、項目の内部値を変更する関数 (copiedarray[0].changevalue();または などcopiedarray[index].someval=newval;) を呼び出さない場合は、項目への参照を新しい配列にコピーできます。

var a = [{a:0}];
var b = a.concat([]);
// can't do a[0].a=newValue or it'll permanently change
a.splice(0,1);
console.log(b[0]);//=0

UnsafeClone はオブジェクトを完全に複製しますが、任意のオブジェクト (プロパティ) のプロパティがそれ自体を参照すると、終わりのないループを開始するリスクがあります。

var a = [{a:0}];
var b = goog.object.unsafeClone(a);
a[0].a=22;
console.log(b[0]);//=0
console.log(b instanceof Array);//true

あなたの場合; コピーされるオブジェクトは JSON 文字列から取得されるため、循環参照は発生しませんが、unsafeClone はより遅い可能性があるため、より良い方法があるかもしれません。goog.json.parse

...
if (request.isSuccess()) {
    targetVocab = request.getResponseText();
    setVocab();
}
...
var setVocab = function() {
  vocab = goog.json.parse(targetVocab)['targetVocab'];
}    
...
于 2013-07-10T09:06:28.063 に答える