2011-01-02 6 views
1

ich in meiner Erweiterung des Einstellungsfenster eine „Standardeinstellungen wiederherstellen“ Taste haben wollen:korrekte Präferenzwert in onsyncfrompreference nach preference.reset Zugriff()

<prefpane id="nextplease.phrases" label="&options.phrases.title;" 
      image="chrome://nextplease/skin/Document.png"> 
    <preferences> 
     <preference id="nextphrases" name="nextplease.nextphrase.expr0" 
        type="unichar"/> 
     ... 
    </preferences> 
    <hbox flex="1"> 
     ... 
       <listbox id="nextphrases_list" seltype="multiple" flex="1" 
        onkeypress="nextplease.removeSelectedOnDelete(event, this);" 
        onselect="nextplease.enableDisableRemoveButton(this);" 
        preference="nextphrases" preference-editable="true" 
        onsynctopreference="return nextplease.syncListbox(this);" 
        onsyncfrompreference="nextplease.loadListboxPreference(this);"/> 
       ... 
       <button label="&options.restoreDefault;" 
        oncommand="nextplease.restoreDefaultListbox(this);" /> 
      </hbox> 
     </vbox> 
    </hbox> 
</prefpane> 

Dies ist der JavaScript-Code für die Funktionen:

nextplease.restoreDefaultListbox = function (node) { 
    var listbox = node.parentNode.parentNode.firstChild.selectedPanel; 
    var preferenceId = listbox.getAttribute("preference"); 
    var preference = document.getElementById(preferenceId); 
    preference.reset(); 
    alert("preference.value="+preference.value+"; preference.valueFromPreferences="+preference.valueFromPreferences); 
    preference.setElementValue(listbox); 
}; 

nextplease.loadListboxPreference = function (listbox) { 
    var i, phrase, values; 

    var preferenceId = listbox.getAttribute("preference"); 
    var preference = document.getElementById(preferenceId); 
    var prefValue = ??? // neither preference.value nor preference.valueFromPreferences work, see below 
    // alert("Loading: "+prefValue); 

    // remove all items already in listbox 
    for (i = listbox.itemCount; i >= 0; i--) { 
     listbox.removeItemAt(i); 
    } 

    values = prefValue.split("|"); 
    for (i = 0; i < values.length; i++) { 
     phrase = values[i].replace(/&pipe;/g, "|"); 
     if (phrase !== "") { 
      listbox.appendItem(phrase, phrase); 

      // Scroll to the newly added item to workaround 
      // what I think is a Firefox bug. I was getting 
      // Javascript exceptions when trying to read the 
      // values at the bottom that are "hidden". 
      listbox.ensureIndexIsVisible(listbox.getRowCount() - 1); 
     } 
    } 
    listbox.ensureIndexIsVisible(0); 
}; 

Nun, wenn ich auf die Schaltfläche klicken, wird der Alarm I (nach preference.reset()) erhalten wie folgt aussieht:

preference.value = undefiniert; preference.valueFromPreferences = alter Benutzer eingestellten Präferenzwert

So scheint es, wie in onsyncfrompreference den richtigen Präferenzwert kann nur in eine wirklich hässlichen Art und Weise zugegriffen werden:

if (preference.value === undefined) { 
    prefValue = preference.preferences.defaultBranch.getIntValue(preference.name); // or other type instead of Int 
} else { 
    prefValue = preference.value; 
} 

Gibt es eine bessere Alternative ? Konkret, eine, die für jeden Präferenztyp funktionieren würde?

+0

Ist diese Frage anders als Ihre vorherige? Wenn nicht, sollten Sie Ihre vorherige Frage bearbeiten und vielleicht ein Kopfgeld hinzufügen. –

+0

Ja, das ist anders. Dieses Problem 1) tritt nur beim Wiederherstellen von Standardwerten auf (die überhaupt nicht in diese Frage einbezogen sind); 2) mit der anderen Synchronisationsrichtung. –

Antwort

1

Wenn pref.value === undefined, sollten Sie pref.defaultValue verwenden, um den anzuzeigenden Wert zu erhalten. Ich habe die Referenzseite aktualisiert und the onsyncfrompreference documentation, um das zu sagen.

+0

Ah, also hat es eine Eigenschaft 'defaultValue'! Nett. Ich kann meine Workaround jetzt loswerden ... –