tak ve všech profilech se mi objevil stejný záznam ( nastavil jsem záznam site_rule na http adresu a ta se objevila ve všech profilech) a tak se domnívám, že výše uvedeným přiřazením data.advanced[title] = advanced_obj; jsem jen uložil odkaz na objekt což v důsledku způsobilo že prohlížeč uložil stejné data z jednoho profilu i do dalších profilů (ale ukládal jsem data z jednoho aktuálně editovaného profilu). Takže bych chtěl dokončit co jsem původně chtěl udělat, ale nevěděl jsem jak to udělat - nejdříve naklonovat ten objekt a pak do něj zkopírovat hodnoty pro daný profil ... profil[title].
Takže vytvořím si několik zkušebních profilů v tomto pořadí
- default,
- write
- something
- interesting
pod každým mám data pro jeden formulář.
Vyberu profil, a do site_rule si napíšu nějaký údaj třeba test, dám uložit.
A test se objeví u více položek ale ne u všech. A tak je to s každým profilem, ale dělá to různě, ne že to uloží do všech profilů. title je jedinečný název profilu, takže mi to nedává vůbec smysl.
function mo()
{
this.site_rule : "";
}
obj1 = new mo();
obj2 = new mo();
Klonovani dat pak resim cyklem.
Bohuzel nejsem u sveho pc, jinak bych ti mohl pridat kod, ktery jsem si udelal pro spravu databaze. Kde pro pridavani zaznamu do pole naklonuji strukturu radku. Vyuzival jsem to pro tabulky chatu :) jako text, seznam uzivatelu a tak
A víš co? Všechny položky kromě první se vynulujou na "". K tomu ta co jsem měnil obsahuje text title. Takže když změním jednu a pak změním druhou tak ta předchozí se přepíše na "" a druhá se uloží na title. To by u normálního objektu být nemělo. Je to jak kdyby se tím title odkazovalo na tři různé objekty.
Chybu jsem našel, bylo to špatnou podmínkou a taky jsem přehlédl ještě jedno místo kde se ten objekt měl advanced_obj kopírovat a tam jsem jen udělal = advanced_obj;
Kdyby ses zabýval programováním doplňků tak bych ti ten kód poslal, takhle to asi nemá moc smysl. Myslel jsem že už se to vyřešilo, ale ne. Je to moc podivné a už nevím jak to odladit. Problém je že v JS ani nemohu zobrazit adresu na kterou ta proměnná odkazuje, abych si ověřil jestli je tam někde něco špatně. Podle analýzy co jsem dělal naposled se zdá že data se ukládají správně, ale nesprávně se načítají. Při otevření stránky vidím správné uložené hodnoty. Jakmile ale přepnu na jiný profil a pak zase zpět tak tam jsou hodnoty jiné aniž bych cokoliv znova ukládal.
Tak mas asi nekde spatne logiku. Kdyz to nejde, doporucuji vse zkopirovat do vedlejsiho souboru, smazat a zacit znovu. Postupne si odlad kazdy krok zvlast.
Nevim, co myslis zobrazenim cesty, ale objekt si muzes vypisovat. Jen si musis davat bacha na klicova slova jako window a pod. Tam je schopen se zacyklit pri prochazeni vsech vetsi objektu.
str = '';
for (key in x) {str += key + "\n"';}
alert(str);
Jo, uz jsem u sebe, takze pak kodu, co pouzivam v tom chatu. Pri selectu celej objekt naklonuji, protoze jinak by mi editoval zaznam v db (js tabulce s objekty). Coz nechci.
U JS je ta nevyhoda, ze nemuzes definovat, jestli ches klon objektu nebo jenom ukazatel. automaticky dava ukazatel :)
function is_object(data)
{
return typeof(data)==='object' || typeof(data)==='array';
}
function cloneObject(obj)
{
var i, new_obj;
new_obj = {};
for (i in obj)
{
if (!is_object(obj[i]))
{new_obj[i] = obj[i];}
else {new_obj[i] = cloneObject(obj[i]);}
}
return new_obj;
}
//-----
function classDb(structure)
{
this.table = [];
this.structure = structure;
this.drop = function(data)
{
this.table = [];
}
this.import = function(data)
{
var i;
this.table = data;
for(i=0;i<this.table.length;i++)
{
this.table[i].index = i;
}
}
this.export = function(data)
{
return this.table;
}
this.insert = function(data)
{
var key, new_row, index;
if (!is_object(data))
{
return;
}
index = this.table.length;
new_row = new this.structure;
for (key in new_row) //this.table[index]
{
new_row[key] = data[key] ? data[key] : '';
}
new_row.index = index;
this.table[index] = new_row;
return new_row;
}
this.update = function(where,data)
{
var row,key,value;
row = this.select(where); // read
if (row && is_object(row))
{
for(key in where)
{
value = where[key];
if (!is_null(value) && isset(row[key])) // ignore undefined
{
row[key] = value;
}
}
this.table[row.index] = row; // write
return row;
}
return false;
}
this.select = function(where)
{
var i,row,bool,key,value;
for(i=0;i<this.table.length;i++)
{
row = this.table[i];
bool = true;
for(key in where)
{
value = where[key];
if (!is_null(value) && isset(row[key])) // ignore undefined
{
bool &= row[key] == value;
if (!bool) break;
}
}
if (bool)
{
return cloneObject(row);
}
}
return false;
}
}
// ----
function classUser()
{
this.index = null; // unique autoincrement
this.id = null;
this.name = null;
this.psw = null;
this.ip = null;
this.time = null;
this.id_peer = null;
this.color = null;
}
/ ---
CHAT.users_db = new classDb(classUser);
//...
CHAT.userlist.add = function (user)
{
CHAT.users_db.insert(user);
CHAT.userlist.show();
};
nepsal jsem cesta ale adresa (paměti). Jdu ověřit selectedIndex a title jaké maj hodnoty a třeba něco najdu.
Edit: Asi jsem na to přišel
Mám tam select box, kde vybírám profil. Když vyberu profil tak spouštím funkci restore
function restore(e = null)
funkce určená jak pro nahrání defaultních hodnot do formuláře. Předpokládal jsem, že když vyberu profil tak mám nastavit defaultní profil (to je ten co byl uložen naposled že ho používám). A to je chyba. Vždyť když vyberu profil, musím tam dosadit aktuální profil a ne defaultní.
Třídy v JS se používaj od kdy? Nikdy jsem to ještě neviděl.
Jinak ten script nejspíš nahraju na net až bude hotový, je to ale addon takže pokud tě to zajímá je třeba k tomu Firefox 48 beta (mělo by jít stáhnout jestli není momentálně spadlý server). Výhoda toho co dělám, napíšu si script a mohu na něm upravit jakoukoliv webovou stránku (prostě ten svůj script k té stránce připojím). Případně si napsat script na stahování obrázků. Ale teprve se to učím. Takže v tom Firefoxu se dá na stránce about:debugging připojit ten addon a otestovat si ho.
#11oxidián
Jinak třídy se používají v JavaScriptu od ES6, kdy do jazyka bylo doplněno kromě jiných funkcí jak klíčové slovo class, tak klíčové slovo extends. :)
Dříve určitou roli tříd a objektů hrály díky prototypové dědičnosti právě funkce.
Mám čtyři moduly (scripty) do addonu. Jedná se o moduly s volbami. Používají stejné názvy proměnných, ale bylo by lépe to dát do namespaců. Jaká je praxe?
#16oxidián
Pokud jde o běžný JavaScript, kdy si napíšeš skripty do pár .js souborů a ty si poté přimo includneš na stránku, tak nevím. Pokud ale pracuješ v Node, tam se Namespace nepoužívají, protože nemají moc účel. Každý modul jsi schopný naimportovat přímo ze složky a protože se importuje přímo do proměnné, můžeš mu dát jakýkoliv název chceš.
Programátoři Mozilly to používali v SDK, ale je to už minulost, protože dneska se prosazuje Webextension API, který má aktivní podporu multiprocesoringu. Tedy od verze Firefoxu 48.