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?
Ist diese Frage anders als Ihre vorherige? Wenn nicht, sollten Sie Ihre vorherige Frage bearbeiten und vielleicht ein Kopfgeld hinzufügen. –
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. –