2016-01-12 7 views
5

Come accedere alle variabili di condivisione & tra elementi personalizzati? Ho i seguenti file ...Elementi personalizzati Aurelia all'interno di elementi personalizzati e variabili di condivisione

tip.html

<template> 
    <div class="tip-container"> 
     <content select="tip-trigger"></content> 
     <content select="tip-content"></content> 
    </div> 
</template> 

tip.js

export class Tip {} 

punta-trigger.html

<template> 
    <span class="tip-trigger" click.trigger="showTip()"> 
     <content></content> 
    </span> 
</template> 

tip-trigger.js

export class TipTrigger { 
    showTip() { 
     console.debug(this); 
    } 
} 

tip-content.html

<template> 
    <span class="tip"> 
     <content></content> 
     <span class="tip__close tip__close--default">×</span> 
     <span class="tip__color"></span> 
    </span> 
</template> 

punta di content.js

export class TipContent {} 

nella mia classe Tip vorrei avere un nome di variabile visible. Quando showTip viene attivato, visible dovrebbe essere impostato su true, che poi utilizzerei per aggiungere una classe in tip-content.html. Come posso condividere variabili tra questi elementi personalizzati per farlo?

L'idea è di creare un elemento per mostrare i pop-tip di tip in cui qualsiasi tipo di contenuto può essere il trigger e qualsiasi tipo di contenuto può essere visualizzato quando attivato. Esempio di base:

<tip> 
    <tip-trigger><button>?</button></tip-trigger> 
    <tip-content><div>Here is some helpful info...</div></tip-content> 
</tip> 

risposta

1

Avete solo bisogno di trasformare Tip in una classe di servizio simile e importarlo?

export class Tip { 
    constructor() { 
     this.visible = false; 
    } 
    show() { 
     this.visible = true; // Or whatever to show the content 
    } 
    hide() { 
     this.visible = false; 
    } 
} 

Poi:

import {inject} from 'aurelia-framework'; 
import {Tip} from './tip'; 

@inject(Tip) 
export class TipTrigger { 
    constructor(tip) { 
     this.tip = tip; 
    } 
    showTip() { 
     this.tip.show(); 
     // Or I suppose you could access 'visible' directly 
     // but I like the implementation details a method call offers. 
    } 
} 

* Disclaimer: Questo è testato.

+0

Quello era il pezzo mancante. Grazie! – Dustin

+1

@David M. Brown Ho pensato che non avrebbe funzionato se si aggiungessero 2 suggerimenti in una vista perché si suppone che iniettino dei singleton (a meno che non si usi il decoratore "transient' in Tip). Ma il fatto è che [funziona] (http://plnkr.co/edit/5nwPD8rkRm2jWTBtw874?p=preview). Se si utilizza una classe diversa per controllare la vista Tip [si comporta realmente come un singleton] (http://plnkr.co/edit/aA2YscqOaPkV5NUCiYe0?p=preview). Curioso ... – DaniCE

+0

Anch'io ho condiviso questa preoccupazione. Sto ancora imparando molto su come funziona Aurelia e le cose associate. – devguydavid

2

Here è una soluzione al problema in Plunker.

Nota che gli elementi punta-trigger e punta di contenuti sono solo parti sostituibili del modello. Non hanno bisogno di essere componenti stessi (che mi ha confuso molto nel "original" custom elements article).

app.html:

<template> 
    <require from="tip"></require> 
    <tip> 
     <tip-trigger><button>?</button></tip-trigger> 
     <tip-content><div>Here is some helpful info...</div></tip-content> 
    </tip> 
</template> 

tip.html:

<template> 
    <div class="tip-container"> 
     <div> 
     <div click.trigger="showContent()"> 
      <content select="tip-trigger"></content> 
     </div> 
     </div> 
     <div show.bind="contentVisible"> 
     tip content: 
     <content select="tip-content"></content> 
     </div> 
    </div> 
</template> 

tip.js:

export class Tip { 
    showContent(){ 
    this.contentVisible = !this.contentVisible; 
    } 
} 
+0

Questo è molto più semplice. Grazie! – Dustin

+1

Dire che volevo aggiungere attributi a '' o ''. È possibile? Se sì, come potrei accedervi? E 'questo il punto in cui avresti bisogno di essere loro stessi componenti? Se è così, questo mi riporta al mio problema originale su come accedere a una variabile tra i componenti. – Dustin

+0

Sì, in tal caso avrete bisogno di 'tip-trigger' e' tip-content' per essere componenti. Vedi i commenti a @ David M. Brown risposta sulla comunicazione tra i componenti. – DaniCE

Problemi correlati