2010-08-24 9 views
0

Suite à Setting javascript defineGetter and defineSetter in a loop, j'ai maintenant des problèmes avec la définition de setters dans une boucle.defineSetter dans une boucle

Ceci est le code que j'essaie d'utiliser dans un script Greasemonkey.

var setValue_InStoredObject = function(_prefName, _varName, _newValue) 
{ 

    console.info('setValue_InStoredObject:\narguments = '); 
    console.info(arguments); 

    var tmp_original = JSON.parse(GM_getValue(_prefName, JSON.stringify(defaultColumnPrefixes))); 
    console.info(JSON.stringify(tmp_original)); 

    tmp_original[_varName] = _newValue; 
    console.info(JSON.stringify(tmp_original)); 

    GM_setValue(_prefName,JSON.stringify(tmp_original)); 

}; 

var getValue_FromStoredObject = function(_prefName, _varName, _defaultValue) { 
    return function() { 
    return JSON.parse(GM_getValue(_prefName, JSON.stringify(_defaultValue)))[_varName]; 
    }; 
}; 

function addSettersGetters(_obj, _prefName,_defaults) 
{ 
    console.info(arguments); 
    for(var loop_columnName in _defaults) 
    { 
    var getfunc = getValue_FromStoredObject(_prefName,loop_columnName, _defaults); 

    _obj.__defineGetter__(loop_columnName, getfunc); 
    var setfunc = function(_newValue) { setValue_InStoredObject(_prefName,loop_columnName, _newValue) }; 
    _obj.__defineSetter__(loop_columnName, setfunc); 
    } 
} 

var defaultColumnPrefixes = { 
    "flag": " | ", 
    "refName": " ", 
    "refSince": " ", 
    "nextPayment": " ", 
    "lastClick": " ", 
    "totalClicks": " ", 
    "average": " ", 
    "clickText": " ", 
    "average_1": " ", 
    "average_2": " ", 
    "RSA": " ", 
    "SD": " ", 
    "profit": "$" 
}; 

var prefs = new function() 
{ 
    // Referral listings. Column preferences 
    this.columnPrefix = {}; 
    addSettersGetters(this.columnPrefix, 'columnPrefix',defaultColumnPrefixes); 


    // Some logging to test whether the getters/setters work 
    // note: getters appear to work, though setters appear to have the same problem 
    // as those encountered when attempting to define the getters 
    console.info('this.columnPrefix.flag = '+ this.columnPrefix.flag); 
    console.info('this.columnPrefix.profit = '+ this.columnPrefix.profit); 

    console.group(); 
    console.info('---'); 
    // set the flag prefix to something (usually) different each time 
    this.columnPrefix.flag = new Date().getMilliseconds(); 
    console.info('---'); 
    console.groupEnd(); 

    console.info('this.columnPrefix.flag = '+ this.columnPrefix.flag); 
    console.info('this.columnPrefix.profit = '+ this.columnPrefix.profit); 
} 

qui produit la sortie suivante dans Firebug:

this.columnPrefix.flag = | 
this.columnPrefix.profit = $ 

--- 

setValue_InStoredObject: arguments =  
["columnPrefix", "profit", 595]  
{"flag":" | ","refName":" ","refSince":" ","nextPayment":" ","lastClick":" ","totalClicks":" ","average":" ","clickText":" ","average_1":" ","average_2":" ","RSA":" ","SD":" ","profit":"$"}  
{"flag":" | ","refName":" ","refSince":" ","nextPayment":" ","lastClick":" ","totalClicks":" ","average":" ","clickText":" ","average_1":" ","average_2":" ","RSA":" ","SD":" ","profit":595} 

--- 

this.columnPrefix.flag = |  
this.columnPrefix.profit = 595 

Je soupçonne que cela est causé par le même problème que mon autre question, mais je suis à venir contre l'esprit des blocs et ne semble pas prête trouver un moyen de le faire fonctionner.

Aidez s'il vous plaît? =]

Répondre

1

Essayez de définir var setFunc sur la boucle for.

var setFunction = function(_prefName,loop_columnName){ 
    return function(_newValue){ 
     setValue_InStoredObject(_prefName,loop_columnName, _newValue) 
    } 
}; 

Puis dans la boucle:

var setfunc = setFunction(_prefName,loop_columnName); 
_obj.__defineSetter__(loop_columnName, setfunc); 
+0

Pas de chance avec cette - la fonction setter (de setfunc) exactement une variable attend (la valeur assignée). En utilisant le code exactement comme vous l'avez suggéré, l'erreur '_newValue' est indéfinie, et l'encapsuler dans une fonction ne fonctionne pas (même résultat avec/sans 'return'). Le problème semble être que 'loop_columnName' reste défini sur la dernière valeur dans la boucle - le problème de fermeture si je ne me trompe pas? – kwah

+0

Cela fonctionne-t-il de cette façon (voir la réponse éditée)? –

+0

IMPRESSIONNANT! Au premier test, il semble fonctionner parfaitement =] Je dois encore regarder de plus près avant de pouvoir comprendre exactement ce qui se passe. – kwah