2016-01-12 15 views
5

Jak uzyskać dostęp do zmiennych użytkownika między elementami niestandardowymi? Mam następujące pliki ...Elementy niestandardowe Aurelia wewnątrz elementów niestandardowych i współużytkowanie zmiennych

tip.html

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

tip.js

export class Tip {} 

tip-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> 

tip-content.js

export class TipContent {} 

W moim Tip klasy chciałbym mieć nazwę zmiennej visible. Po wywołaniu showTipvisible zostanie ustawione na wartość true, co następnie wykorzystam do dodania klasy do tip-content.html. Jak mogę udostępnić zmienne między tymi elementami niestandardowymi, aby to zrobić?

Chodzi o to, aby utworzyć element wyświetlający wyskakujące okna z napisem "tip-up", w których dowolny rodzaj treści może być wyzwalaczem, a po uruchomieniu można wyświetlić dowolny rodzaj treści. Przykładem podstawowe:

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

Odpowiedz

1

Czy wystarczy włączyć Tip do klasy usług, jak i importować?

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

Następnie:

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. 
    } 
} 

* Uwaga: To jest niesprawdzone.

+0

To był brakujący element. Dzięki! – Dustin

+1

@ David M. Brown Myślałem, że to nie zadziała, jeśli dodasz 2 wskazówki w widoku, ponieważ inject ma tworzyć singletony (chyba że używasz 'przejściowego' dekoratora w Tip). Ale faktem jest, że [to woks] (http://plnkr.co/edit/5nwPD8rkRm2jWTBtw874?p=preview). Jeśli używasz innej klasy do kontrolowania widoku Tip [to naprawdę zachowuje się jak singleton] (http://plnkr.co/edit/aA2YscqOaPkV5NUCiYe0?p=preview). Ciekawy ... – DaniCE

+0

Ja również podzielałem tę troskę. Nadal bardzo dużo uczę się, jak działa Aurelia i związane z nią rzeczy. – devguydavid

2

Here jest rozwiązanie problemu w Plunker.

Uwaga że tip-trigger tip-content i elementy są po prostu wymiennymi częściami szablonu. Nie muszą być komponentami (to bardzo mnie zdezorientowało w "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

To znacznie prostsze. Dziękuję Ci! – Dustin

+1

Powiedzmy, że chciałem dodać atrybuty do '' lub ''. Czy to jest możliwe? Jeśli tak, w jaki sposób mam do nich dostęp? Czy to jest miejsce, w którym trzeba by je same składać? Jeśli tak, to zabiera mnie z powrotem do mojego pierwotnego problemu, jak uzyskać dostęp do zmiennej między komponentami. – Dustin

+0

Tak, w takim przypadku będziesz potrzebował składników "tip-trigger" i "tip-content". Zobacz komentarze do @ David M. Brown odpowiedź na temat komunikacji między komponentami. – DaniCE

Powiązane problemy