Auto-riferimenti negli oggetti letterali / inizializzatori


705

C'è un modo per far funzionare qualcosa come il seguente in JavaScript?

var foo = {
    a: 5,
    b: 6,
    c: this.a + this.b  // Doesn't work
};

Nella forma attuale, questo codice genera ovviamente un errore di riferimento poiché thisnon si riferisce a foo. Ma è Esiste un modo per avere valori in proprietà di un oggetto letterale dipendere da altri beni dichiarati in precedenza?

Risposte:


744

Bene, l'unica cosa di cui posso parlarti sono getter :

var foo = {
  a: 5,
  b: 6,
  get c() {
    return this.a + this.b;
  }
}

console.log(foo.c) // 11

Questa è un'estensione sintattica introdotta dalla specifica ECMAScript 5th Edition, la sintassi è supportata dalla maggior parte dei browser moderni (incluso IE9).


32
Risposta molto utile Maggiori informazioni su "get" sono disponibili qui: developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/…
jake

5
@FaustoR. Sì lo fa.
Charlie Martin,

48
Attenzione che con questa soluzione, se i valori di foo.ao foo.bvengono modificati, anche il valore di foo.ccambierà in sincronismo. Questo può essere o meno ciò che è richiesto.
HBP,

8
Si noti che si thislega all'oggetto nidificato più profondo. Ad esempio:... x: { get c () { /*this is x, not foo*/ } } ...
Z. Khullah,

3
Per completare la mia affermazione di cui sopra, poiché fooviene dichiarata come variabile e cverrà valutata solo nel momento in cui viene invocata, l'utilizzo di fooinside cfunzionerà, al contrario di this(attenzione però)
Z. Khullah,

316

Potresti fare qualcosa del tipo:

var foo = {
   a: 5,
   b: 6,
   init: function() {
       this.c = this.a + this.b;
       return this;
   }
}.init();

Questa sarebbe una specie di inizializzazione una volta dell'oggetto.

Si noti che si sta effettivamente assegnando il valore restituito di init()a foo, quindi è necessario return this.


95
puoi anche delete this.initprima return thische foonon sia inquinato
Billy Moon il

15
@BillyMoon: Sì, in effetti, sebbene ciò influisca sulle prestazioni di tutti gli accessi di proprietà successivi su quell'oggetto, su molti motori (V8, per esempio).
TJ Crowder,

8
@MuhammadUmer: non sono sicuro di come le classi ES6 siano pertinenti alla domanda.
Felix Kling,

8
@MuhammadUmer: le classi sono solo zucchero sintattico per le funzioni di costruzione, quindi non forniscono davvero nulla di nuovo. In entrambi i casi, l'obiettivo principale di questa domanda sono gli oggetti letterali.
Felix Kling,

3
@akantoword: Fantastico :) poiché i letterali degli oggetti sono una singola espressione, la init()chiamata è stata aggiunta direttamente al letterale per mantenerla una singola espressione. Ma ovviamente puoi chiamare la funzione separatamente da te.
Felix Kling

181

Manca la risposta ovvia e semplice, quindi per completezza:

Ma è Esiste un modo per avere valori in proprietà di un oggetto letterale dipendere da altri beni dichiarati in precedenza?

No. Tutte le soluzioni qui lo differiscono fino a quando l'oggetto non viene creato (in vari modi) e quindi assegna la terza proprietà. Il modo più semplice è semplicemente fare questo:

var foo = {
    a: 5,
    b: 6
};
foo.c = foo.a + foo.b;

Tutti gli altri sono solo modi più indiretti di fare la stessa cosa. (Felix's è particolarmente intelligente, ma richiede la creazione e la distruzione di una funzione temporanea, l'aggiunta di complessità; e lascia una proprietà aggiuntiva sull'oggetto o [se deletequella proprietà] influisce sulle prestazioni degli accessi alle proprietà successive su quell'oggetto.)

Se è necessario che siano tutti all'interno di un'espressione, è possibile farlo senza la proprietà temporanea:

var foo = function(o) {
    o.c = o.a + o.b;
    return o;
}({a: 5, b: 6});

O ovviamente, se devi farlo più di una volta:

function buildFoo(a, b) {
    var o = {a: a, b: b};
    o.c = o.a + o.b;
    return o;
}

quindi dove è necessario utilizzarlo:

var foo = buildFoo(5, 6);

Per la mia sanità mentale, sto cercando di trovare una sorta di documentazione ufficiale che dice sostanzialmente la stessa cosa: che un oggetto thisè disponibile solo per i metodi di detto oggetto e nessun altro tipo di proprietà. Qualche idea su dove potrei trovarlo? Grazie!
David Kennell,

1
@DavidKennell: non diventa più ufficiale delle specifiche . :-) Probabilmente inizieresti da qui e lo seguiresti. È un linguaggio abbastanza imbarazzante, ma fondamentalmente vedrai nei vari sottoclausi della valutazione delle definizioni delle proprietà che l'oggetto non è disponibile per le operazioni che determinano i valori degli inizializzatori delle proprietà.
TJ Crowder,

Non riesco a vedere i risultati del browser qui , ma non è più così? Nel mio ambiente, v8: deleteè del 10% più veloce e geco: deleteè solo dell'1% più lento.
TheMaster

1
@TheMaster - Sì, non penso più che BrowserScope sia davvero una cosa. Sembra che l'eliminazione non sia così grave come una volta, almeno non in V8 (Chrome, ecc.) O SpiderMonkey. Ancora più lento, ma solo un pochino, e queste cose sono stranamente veloci in questi giorni.
TJ Crowder

63

Crea un'istanza di una funzione anonima:

var foo = new function () {
    this.a = 5;
    this.b = 6;
    this.c = this.a + this.b;
};

1
@Bergi, perché? Perché qualcuno potrebbe istanziare un altro dello stesso oggetto da esso? Non è che non possano semplicemente clonare un oggetto letteralmente. Non è diverso dal passare un argomento come, new Point(x, y)tranne per il fatto che la funzione non è nominata per il riutilizzo.
zzzzBov

1
@zzzzBov: Naturalmente possono semplicemente clonare l'oggetto, ma rispetto a una soluzione IEFE (come nella risposta di TJCrowder) la tua soluzione perde la funzione di costruzione e crea un oggetto prototipo superfluo.
Bergi,

5
@zzzzBov: basta usare var foo = function() { this.…; return this; }.call({});sintatticamente non molto diverso ma semanticamente sano.
Bergi,

1
@Bergi, se ritieni che sia così importante, perché non aggiungere la tua risposta al mix?
zzzzBov

3
Hai questo. In effetti non ho notato la newparola chiave.
Randy,

26

Ora in ES6 è possibile creare proprietà memorizzate nella cache. Al primo utilizzo la proprietà valuta una volta per diventare una normale proprietà statica. Risultato: la seconda volta che la funzione matematica viene saltata.

La magia è nel getter.

const foo = {
    a: 5,
    b: 6,
    get c() {
        delete this.c;
        return this.c = this.a + this.b
    }
};

Nella freccia getter thisraccoglie l' ambito lessicale circostante .

foo     // {a: 5, b: 6}
foo.c   // 11
foo     // {a: 5, b: 6 , c: 11}  

1
es5 ha anche proprietà che devi solo usare Object.defineProperty(foo, 'c', {get:function() {...}})per definirle. Questo viene fatto facilmente in modo discreto in una fabbrica come questa. Ovviamente se puoi usare lo getzucchero è più leggibile ma la capacità è stata lì.
Aluan Haddad,

21

Qualche chiusura dovrebbe occuparsene;

var foo = function() {
    var a = 5;
    var b = 6;
    var c = a + b;

    return {
        a: a,
        b: b,
        c: c
    }
}();

Tutte le variabili dichiarate all'interno foosono private foo, come ci si aspetterebbe da qualsiasi dichiarazione di funzione e poiché sono tutte nell'ambito, hanno tutte accesso reciproco senza dover fare riferimento this, proprio come ci si aspetterebbe da una funzione. La differenza è che questa funzione restituisce un oggetto che espone le variabili private e le assegna l'oggetto foo. Alla fine, si restituisce solo l'interfaccia che si desidera esporre come oggetto con l' return {}istruzione.

La funzione viene quindi eseguita alla fine con la ()quale viene valutato l'intero oggetto foo, tutte le variabili all'interno di un'istanza e l'oggetto di ritorno aggiunto come proprietà di foo().


14
È confuso e fuorviante definirlo una "chiusura". Sebbene le opinioni differiscano sul significato preciso che restituisce un valore di oggetto da una funzione non costituisce una chiusura nel libro di nessuno.

16

Potresti farlo in questo modo

var a, b
var foo = {
    a: a = 5,
    b: b = 6,
    c: a + b
}

Questo metodo mi è stato utile quando ho dovuto fare riferimento all'oggetto su cui era stata inizialmente dichiarata una funzione. Di seguito è riportato un esempio minimo di come l'ho usato:

function createMyObject() {
    var count = 0, self
    return {
        a: self = {
            log: function() {
                console.log(count++)
                return self
            }
        }
    }
}

Definendo self come l'oggetto che contiene la funzione di stampa, si consente alla funzione di fare riferimento a quell'oggetto. Ciò significa che non sarà necessario "associare" la funzione di stampa a un oggetto se è necessario passarlo altrove.

Se invece lo utilizzassi thiscome illustrato di seguito

function createMyObject() {
    var count = 0
    return {
        a: {
            log: function() {
                console.log(count++)
                return this
            }
        }
    }
}

Quindi il seguente codice registrerà 0, 1, 2 e quindi darà un errore

var o = createMyObject()
var log = o.a.log
o.a.log().log() // this refers to the o.a object so the chaining works
log().log() // this refers to the window object so the chaining fails!

Utilizzando il metodo self si garantisce che print restituirà sempre lo stesso oggetto indipendentemente dal contesto in cui viene eseguita la funzione. Il codice sopra funzionerà bene e registrerà 0, 1, 2 e 3 quando si utilizza la versione di createMyObject().


3
Buoni esempi, tranne che hai lasciato fuori tutti i punti e virgola.

1
Nessun punto e virgola - Va bene davvero!
Kerem Baydoğan,

9

Per il completamento, in ES6 abbiamo delle classi (supportate al momento della stesura di questo solo dai browser più recenti, ma disponibili in Babel, TypeScript e altri transpiler)

class Foo {
  constructor(){
    this.a = 5;
    this.b = 6;
    this.c = this.a + this.b;
  }  
}

const foo = new Foo();

7

Puoi farlo usando il modello del modulo. Proprio come:

var foo = function() {
  var that = {};

  that.a = 7;
  that.b = 6;

  that.c = function() {
    return that.a + that.b;
  }

  return that;
};
var fooObject = foo();
fooObject.c(); //13

Con questo modello è possibile creare un'istanza di più oggetti foo in base alle proprie esigenze.

http://jsfiddle.net/jPNxY/1/


2
Questo non è un esempio del modello di modulo, solo una funzione. Se l'ultima riga della definizione foo fosse }();, si eseguirà da sé e restituirebbe un oggetto, non una funzione. Inoltre, foo.cè una funzione, quindi la scrittura su di essa blocca tale funzione e la successiva chiamata fooObject.c()non riuscirà. Forse questo violino è più vicino a quello che stai cercando (è anche un singleton, non progettato per essere istanziato).
Hollister il

2
"Il modello del modulo era originariamente definito come un modo per fornire incapsulamento sia privato che pubblico per le classi nell'ingegneria del software convenzionale". Da: apprendimento dei modelli di progettazione JavaScript . Questo è l'oggetto che segue il modello di modulo descritto sopra, ma forse non è il migliore per spiegarlo perché non mostra proprietà / metodi pubblici e privati. Questo jsfiddle.net/9nnR5/2 è lo stesso oggetto con proprietà / metodi pubblici e privati. Quindi entrambi seguono questo schema
Rafael Rocha,

6

Esistono diversi modi per ottenere questo risultato; questo è quello che vorrei usare:

function Obj() {
 this.a = 5;
 this.b = this.a + 1;
 // return this; // commented out because this happens automatically
}

var o = new Obj();
o.b; // === 6

2
Funziona, ma elimina i vantaggi della notazione letterale dell'oggetto.
Kpozin,

Vero, mi dispiace di aver perso il tag letterale oggetto in origine. Per lo più uso letterali di oggetti solo per strutture di dati e ogni volta che desidero qualsiasi logica aggiuntiva (che potrebbe assomigliare a una classe) creo l'oggetto come risultato di una funzione proprio per questo motivo.
Ken,

6

solo per motivi di pensiero - posiziona le proprietà dell'oggetto fuori da una linea temporale:

var foo = {
    a: function(){return 5}(),
    b: function(){return 6}(),
    c: function(){return this.a + this.b}
}

console.log(foo.c())

ci sono anche risposte migliori sopra . Ecco come ho modificato il codice di esempio con cui ti sei interrogato.

AGGIORNARE:

var foo = {
    get a(){return 5},
    get b(){return 6},
    get c(){return this.a + this.b}
}
// console.log(foo.c);

2
In ES6 puoi rendere questo approccio generale molto più elegante: var foo = { get a(){return 5}, get b(){return 6}, get c(){return this.a + this.b} }così ora puoi semplicemente fare foo.cinvece di foo.c():) (Sentiti libero di incollarlo nella tua risposta in modo che la formattazione sia migliore!)

5

Creare una nuova funzione sul tuo oggetto letteralmente e invocare un costruttore sembra un radicale allontanamento dal problema originale ed è superfluo.

Non è possibile fare riferimento a una proprietà di pari livello durante l'inizializzazione letterale dell'oggetto.

var x = { a: 1, b: 2, c: a + b } // not defined 
var y = { a: 1, b: 2, c: y.a + y.b } // not defined 

Segue la soluzione più semplice per le proprietà calcolate (nessun heap, nessuna funzione, nessun costruttore):

var x = { a: 1, b: 2 };

x.c = x.a + x.b; // apply computed property

3

Le altre risposte pubblicate qui sono migliori ma ecco un'alternativa che:

  • Imposta il valore all'inizializzazione (non un getter, o derivato, ecc.)
  • Non richiede alcun tipo di init() o codice al di fuori dell'oggetto letterale
  • È un oggetto letterale e non una funzione di fabbrica o un altro meccanico di creazione di oggetti.
  • Non dovrebbe avere alcun impatto sulle prestazioni (tranne all'inizializzazione)

Funzioni anonime autoeseguenti e archiviazione delle finestre

var foo = {
    bar:(function(){
        window.temp = "qwert";
        return window.temp;
    })(),
    baz: window.temp
};

L'ordine è garantito ( barprimabaz ).

windowNaturalmente inquina , ma non riesco a immaginare qualcuno che scriva una sceneggiatura che richiede window.tempdi essere persistente. Può esseretempMyApp se sei paranoico.

È anche brutto ma a volte utile. Un esempio è quando si utilizza un'API con condizioni di inizializzazione rigide e non si desidera effettuare il refactoring, pertanto l'ambito è corretto.

Ed è asciutto, ovviamente.


3

La chiave di tutto questo è SCOPE .

È necessario incapsulare "parent" (oggetto parent) della proprietà che si desidera definire come proprio oggetto istanziato, quindi è possibile fare riferimento a proprietà di pari livello usando la parola chiave this

È molto, molto importante ricordare che se ti riferisci thissenza prima farlo, allora thissi riferirà all'ambito esterno ... che sarà l' windowoggetto.

var x = 9   //this is really window.x
var bar = {
  x: 1,
  y: 2,
  foo: new function(){
    this.a = 5, //assign value
    this.b = 6,
    this.c = this.a + this.b;  // 11
  },
  z: this.x   // 9 (not 1 as you might expect, b/c *this* refers `window` object)
};

2
Questo non è nemmeno valido JS.

2

se il tuo oggetto è scritto come una funzione che restituisce un oggetto, E usi 'metodi' di attributo oggetto ES6, allora è possibile:

const module = (state) => ({
  a: 1,
  oneThing() {
    state.b = state.b + this.a
  },
  anotherThing() {
    this.oneThing();
    state.c = state.b + this.a
  },
});

const store = {b: 10};
const root = module(store);

root.oneThing();
console.log(store);

root.anotherThing();
console.log(store);

console.log(root, Object.keys(root), root.prototype);

2

Uso il seguente codice come alternativa e funziona. E anche la variabile può essere array. (@ Fausto R.)

var foo = {
  a: 5,
  b: 6,
  c: function() {
    return this.a + this.b;
  },

  d: [10,20,30],
  e: function(x) {
    this.d.push(x);
    return this.d;
  }
};
foo.c(); // 11
foo.e(40); // foo.d = [10,20,30,40]

2

Ecco un bel modo ES6:

var foo = (o => ({
    ...o,
    c: o.a + o.b
  }))({
    a: 5,
    b: 6
  });
  
console.log(foo);

Lo uso per fare qualcosa del genere:

const constants = Object.freeze(
  (_ => ({
    ..._,
    flag_data: {
      [_.a_flag]: 'foo',
      [_.b_flag]: 'bar',
      [_.c_flag]: 'oof'
    }
  }))({
    a_flag: 5,
    b_flag: 6,
    c_flag: 7,
  })
);

console.log(constants.flag_data[constants.b_flag]);


1

Che ne dici di questa soluzione funzionerà anche con oggetti nidificati con array

      Object.prototype.assignOwnProVal
     = function (to,from){ 
            function compose(obj,string){ 
                var parts = string.split('.'); 
                var newObj = obj[parts[0]]; 
                if(parts[1]){ 
                    parts.splice(0,1);
                    var newString = parts.join('.'); 
                    return compose(newObj,newString); 
                } 
                return newObj; 
            } 
            this[to] = compose(this,from);
     } 
     var obj = { name : 'Gaurav', temp : 
                  {id : [10,20], city:
                        {street:'Brunswick'}} } 
     obj.assignOwnProVal('street','temp.city.street'); 
     obj.assignOwnProVal('myid','temp.id.1');

0

Lanciare un'opzione poiché non ho visto questo scenario esatto coperto. Se non vuoi essere caggiornato quando ao baggiorna, allora un ES6 IIFE funziona bene.

var foo = ((a,b) => ({
    a,
    b,
    c: a + b
}))(a,b);

Per le mie esigenze, ho un oggetto relativo a un array che finirà per essere utilizzato in un ciclo, quindi voglio solo calcolare una configurazione comune una volta, quindi questo è quello che ho:

  let processingState = ((indexOfSelectedTier) => ({
      selectedTier,
      indexOfSelectedTier,
      hasUpperTierSelection: tiers.slice(0,indexOfSelectedTier)
                             .some(t => pendingSelectedFiltersState[t.name]),
  }))(tiers.indexOf(selectedTier));

Dato che devo impostare una proprietà per indexOfSelectedTiere devo usare quel valore quando imposto la hasUpperTierSelectionproprietà, calcolo prima quel valore e lo passo come parametro all'IIFE


0

Un altro approccio sarebbe quello di dichiarare l'oggetto prima di assegnare le proprietà al suo interno:

const foo = {};
foo.a = 5;
foo.b = 6;
foo.c = foo.a + foo.b;  // Does work
foo.getSum = () => foo.a + foo.b + foo.c;  // foo.getSum() === 22

Con ciò, è possibile utilizzare il nome della variabile oggetto per accedere ai valori già assegnati.
Ideale per config.jsfile.


Questo non è un riferimento personale, ma piuttosto un riferimento alla variabile dichiarata fooche punta all'oggetto in questione.
Derek Henderson,

0
var x = {
    a: (window.secreta = 5),
    b: (window.secretb = 6),
    c: window.secreta + window.secretb
};

Questo è quasi identico alla risposta di @ slicedtoad, ma non usa una funzione.


-1

Nota: questa soluzione utilizza Typescript (è possibile utilizzare il JS vanilla che TS compila se necessario)

class asd {
    def = new class {
        ads= 'asd';
        qwe= this.ads + '123';
    };

    // this method is just to check/test this solution 
    check(){
        console.log(this.def.qwe);
    }
}

// these two lines are just to check
let instance = new asd();
instance.check();

Qui usavamo le espressioni di classe per ottenere l'interfaccia letterale dell'oggetto nidificato che avremmo voluto. Questa è la prossima cosa migliore per IMHO di poter fare riferimento alle proprietà di un oggetto durante la creazione.

La cosa principale da notare è che durante l'utilizzo di questa soluzione, hai esattamente la stessa interfaccia che avresti avuto da un oggetto letterale. E la sintassi è abbastanza vicina a un oggetto letterale stesso (rispetto all'utilizzo di una funzione, ecc.).

Confronta quanto segue

Soluzione che ho proposto

class asd {
    def = new class {
        ads= 'asd';
        qwe= this.ads + '123';
    };

Soluzione se i letterali oggetto fossero sufficienti

var asd = {
    def : {
        ads:'asd',
        qwe: this.ads + '123';, //ILLEGAL CODE; just to show ideal scenario
    }
}

Un altro esempio

Qui in questa classe, puoi combinare più percorsi relativi tra loro, il che non è possibile con un oggetto letterale.

class CONSTANT {
    static readonly PATH = new class {
        /** private visibility because these relative paths don't make sense for direct access, they're only useful to path class
         *
         */
        private readonly RELATIVE = new class {
            readonly AFTER_EFFECTS_TEMPLATE_BINARY_VERSION: fs.PathLike = '\\assets\\aep-template\\src\\video-template.aep';
            readonly AFTER_EFFECTS_TEMPLATE_XML_VERSION: fs.PathLike = '\\assets\\aep-template\\intermediates\\video-template.aepx';
            readonly RELATIVE_PATH_TO_AFTER_EFFECTS: fs.PathLike = '\\Adobe\\Adobe After Effects CC 2018\\Support Files\\AfterFX.exe';
            readonly OUTPUT_DIRECTORY_NAME: fs.PathLike = '\\output';
            readonly INPUT_DIRECTORY_NAME: fs.PathLike = '\\input';
            readonly ASSETS_DIRECTORY_NAME: fs.PathLike = '\\assets';
        };
    }
}

2
Potrebbe essere perché la tua risposta è totalmente irrilevante? Sono d'accordo che i downvoter dovrebbero spiegare, ma la tua risposta chiara non ha nulla a che fare con la domanda ...
Manngo,

@Manngo grazie per averlo sottolineato. Onestamente, farei la stessa domanda di OP e utilizzo la soluzione che ho suggerito. Non sono sicuro, perché sia ​​considerato irrilevante. Se hai tempo, ti preghiamo di spiegare in modo che io possa migliorare la risposta o almeno sapere dove sbaglio. Purtroppo non capisco perché questa non sia una soluzione ragionevole.
Dheeraj Bhaskar,

-2

Se si desidera utilizzare JS nativo, le altre risposte forniscono buone soluzioni.

Ma se sei disposto a scrivere oggetti autoreferenziali come:

{ 
  a: ...,
  b: "${this.a + this.a}",
}

Ho scritto una libreria npm denominata oggetto autoreferenziato che supporta tale sintassi e restituisce un oggetto nativo.


1
Si prega di evitare solo le risposte dei collegamenti . Le risposte "a malapena più di un collegamento a un sito esterno" possono essere eliminate .
Quentin,

@Quentin hai qualche suggerimento su come posso migliorare la mia risposta? Le altre risposte a questa domanda coprono come potresti essere in grado di scrivere oggetti autoreferenziali in javascript nativo, ma se vuoi scrivere oggetti autoreferenziali con una sintassi simile alla sintassi nella domanda originale dei poster, penso che la libreria che Ho scritto può essere utile per gli altri alla ricerca di una soluzione. Felice di avere un feedback.
alex-e-leon,

Coppia cose da migliorare qui. Innanzitutto, e ovviamente, stai usando la sintassi letterale del modello senza segni di spunta. Il tuo bvalore della proprietà deve essere: ${this.a + this.a}. In secondo luogo, ma meno importante, si vorrebbe restituire un numero, non una stringa utilizzando qualcosa di simile parseInt. Ultimo e soprattutto, quando ho provato questo esempio semplicemente non funziona, per lo stesso motivo che l'OP sta chiedendo. I thisritorni non sono definiti quando viene utilizzata la propria dichiarazione di oggetto. @ alex-e-leon
Alec Donald Mather

@AlecDonaldMather - grazie per aver dedicato del tempo a dare un'occhiata e fornire un feedback! Se sei interessato al progetto, potrebbe essere meglio spostare questa discussione su github, ma per rispondere ad alcuni dei tuoi feedback: - Usare i backtick: come menzionato nei commenti precedenti, questa sintassi non è supportata da JS, e quindi usa invece le stringhe di backtick è necessario qui per evitare che js cerchi di risolvere "questo" prima che l'obj sia stato definito - restituendo un numero, questo dovrebbe funzionare se a + b sono già numeri, poiché a + b restituirà un numero se sia a che b sono già numeri.
alex-e-leon,

Riguardo questo ritorno indefinito, puoi spiegare come hai provato ad usare la libreria? Questo non dovrebbe succedere, ma forse c'è un caso limite che ho lasciato fuori? Detto questo, questa libreria non risolve completamente il problema e ha il suo set di compromessi, ma se sei interessato ad aiutarmi a migliorarlo / usarlo fammelo sapere!
alex-e-leon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.