Ich habe eine Tabellenzeile, die ein Benutzer auswählen kann, indem er darauf klickt oder zu einer URL geht (Router-Parameter werden bei der Aktivierung des Ansichtsmodells überprüft). Das Markup sieht aus wieAurelia nicht dreckige Prüffunktion Ergebnis in HTML Klasse Attributbindung
<!--...-->
<template repeat.for="foo of foos">
<template repeat.for="bar of foo.bars">
<tr class="${(foo.pk == selectedFoo && bar.pk == selectedBar) ? 'active' : ''}" click.delegate="selectFooBar(foo.pk, bar.pk)"><!--...--></tr>
</template>
</template>
<!--...-->
Das funktioniert gut. Wenn der Benutzer klickt, setzt selectFooBar
die View-Model-Parameter und die Klasse wird auf dem tr
festgelegt.
Allerdings habe ich versucht, die bedingte in eine Methode Refactoring (die bedingte komplexer erhalten):
<tr class="${isFooBarSelected(foo.pk, bar.pk) ? 'active' : ''}" click.delegate="selectFooBar(foo.pk, bar.pk)"><!--...--></tr>
isFooBarSelected
nur liefert true/false basierend auf dem bedingten. Allerdings wird die Methode nach dem Laden der Seite nicht überprüft. Wenn sich die ausgewählten Parameter ändern (weil der Benutzer auf eine andere Zeile klickt), wird die Klasse nicht aktualisiert. Irgendwelche Ideen, wie man Aurelia schmutzig macht, überprüfen isFooBarSelected
?
View-Modell
export class Blah {
foo = [];
selectedFoo = undefined;
selectedBar = undefined;
// ...
/**
* Lifecycle method - just before view-model is displayed
* @param params route parameters
*/
activate(params) {
this.selectedFoo = params.foo;
this.selectedBar = params.bar;
}
selectFooBar(foo, bar) {
this.selectedFoo = foo;
this.selectedBar = bar;
}
isFooBarSelected(foo, bar) {
console.log('check', foo, bar, this.selectedFoo, this.selectedBar);
return foo == this.selectedFoo && bar == this.selectedBar;
}
}