2012-08-13 12 views
7

Ho seguito le estensioni GUI e gli esempi di avviso utilizzano _isEnabled o isEnabled, senza il carattere di sottolineatura. Entrambi sembrano funzionare per estendere o eventualmente sostituire la funzionalità esistente.Qual è la differenza tra _isEnabled e isEnabled in Anguilla?

isEnabled

Ad esempio, la classe PowerTools di base (che non sembra di "estendere" le funzionalità esistenti) ha:

PowerTools.BaseCommand.prototype.isEnabled = function(selection, pipeline) 
{ 
    var p = this.properties; 

    if (!p.initialized) 
    { 
     this.initialize(); 
    } 

    if (!this.isToolConfigured()) 
    { 
     return false; 
    } 

    if (this.isValidSelection) 
    { 
     return this.isValidSelection(selection, pipeline); 
    } 

    return true; 
}; 

Uno strumento in grado di utilizzare questa classe di base e dichiarare. isValidSelection, per esempio:

PowerTools.Commands.CountItems.prototype.isValidSelection = 
             function (selection) { ... } 

_isEnabled

Vedo che Anguilla utilizza ._isEnabled per funzionalità esistenti (nella console di Chrome in numerosi punti del codice). Ad esempio, WhereUsed ha:

Tridion.Cme.Commands.WhereUsed.prototype._isAvailable = 
         function WhereUsed$_isAvailable(selection) ... 

Funzioni private?

Ho familiarità con un carattere di sottolineatura precedente che è una convenzione di denominazione per variabili private. _isEnabled e altre funzioni iniziano con un carattere di sottolineatura "privato?" Se è così, allora

  • Come dovremmo estendere (aggiungere ulteriori funzionalità al codice esistente) queste funzioni?
  • Come dovremmo sostituire (non è stato eseguito il codice esistente, ma i nostri vengono eseguiti come in un "override")?

sto assumendo lo stesso approccio vale per altre funzioni che iniziano con un trattino come _isAvailable e _invoke.

risposta

8

I seguenti metodi sono chiamati per un comando:

  1. isAvailable
  2. isEnabled
  3. invocare

La classe base per tutti i comandi - Tridion.Core.Command - ha uno standard implementazione di questi metodi. Per la maggior parte, questa implementazione predefinita consente estensioni di comandi. Chiamano anche i metodi di sottolineatura (_isAvailable, _isEnabled e _execute).

Non so perché i comandi CME sovrascrivano solo i metodi di sottolineatura. Forse qualcuno ha pensato che fosse più semplice in quel modo. Dovrebbero essere considerati privati ​​(o l'equivalente di "protetti" in C#), quindi in realtà mi sembra una cattiva pratica.

Sarebbe più pulito implementare i metodi corretti (isAvailable, isEnabled e invoke) e quindi chiamare l'implementazione di base utilizzando this.callBase. Tuttavia, in questo caso potrebbe essere necessario interrompere la pipeline o sovrascrivere anche i metodi di sottolineatura, al fine di evitare che il valore di ritorno venga sovrascritto dai metodi di sottolineatura predefiniti. Dipende dal comando che stai implementando o estendendo.

In breve: l'utilizzo dei metodi di sottolineatura è probabilmente una cattiva pratica, ma l'implementazione del Core sembra rendere più difficile per te farlo "correttamente". Quindi punterei a evitare i metodi di sottolineatura, ma non a sudare se si rivela troppo difficile farlo.

P.S. isValidSelection è un metodo solo per PowerTools che separa la logica comune di cui tutti hanno bisogno dalla logica specifica di ciascun comando.

+0

Buon punto su PowerTools 'isValidSelection. Per gestire la pipeline, basta impostarla su true/false? Vedo 'pipeline.stop = true;' nel sorgente .js. –

+0

pipeline.stop = true; in effetti significa che non dovrebbe continuare ad altre estensioni o ai metodi di sottolineatura. Una sorta di "lo so meglio, smetto di cercare altre risposte" –

Problemi correlati