2010-08-24 2 views
0

В качестве дополнения к Setting javascript defineGetter and defineSetter in a loop У меня теперь возникают проблемы с определяющими сеттерами в цикле.defineSetter in a loop

Это код, который я пытаюсь использовать в сценарии 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); 
} 

, который производит следующий вывод в 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 

Я подозреваю, что это связано с той же проблемой, как мой другой вопрос, но я иду против разума блоков и не может показаться найти способ заставить его работать.

Помогите, пожалуйста? =]

ответ

1

Попробуйте установить var setFunc из цикла for.

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

Затем в цикле:

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

Не повезло с этим - функция сеттер (setfunc) ожидает, что именно одна переменная (значение быть назначена). Использование кода точно так же, как вы предложили, выдает ошибку «_newValue» не определено, а ее перенос в функцию не работает (тот же результат с/без «return»). Проблема заключается в том, что 'loop_columnName' продолжает устанавливать последнее значение в цикле - проблема закрытия, если я не ошибаюсь? – kwah

+0

Работает ли это так (см. Отредактированный ответ)? –

+0

УДИВИТЕЛЬНЫЙ! При первом тестировании он работает отлично =] Мне все же нужно посмотреть на него ближе, прежде чем я смогу понять, что именно происходит. – kwah