0

我有一些 Ajax 从数据库中获取信息并将其存储在一个名为targetVocab. 此信息用于设置vocab调用 setVocab() 时的值。这第一次工作正常,但是当再次播放按钮被点击并第二次调用 setVocab 时,它不起作用。第二次出现 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通过再次将其设置为targetVocab. 有没有办法在没有以这种方式连接的两个剩余的情况下设置vocab等于?targetVocab

4

2 回答 2

2

您需要以不同的方式定义函数 setVocab。

我刚刚意识到的第二件事:您应该编写 2 个函数,一个 set 函数和一个 GET 函数,这样就不会再拼接了。

例如

 function setVocab(targetVocab){
    vocab = targetVocab;       
}

这样,您可以确保您确实将 targetVocab 作为变量传递给它。现在相应的 GET 函数:

 function getVocab(){
    return vocab;
}

或者把它放在一个(不推荐)

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 回答