Ich spiele nur mit der benutzerdefinierten Elementfunktionalität in Aurelia und versuchte, ein "Fortschrittsbalken" -Element zu erstellen.Aurelia: Zugreifen auf Custom Element benutzerdefinierte Funktionen oder benutzerdefinierte Attribute
Progress-bar.js
import {customElement, bindable} from 'aurelia-framework';
@customElement('progress-bar')
export class ProgressBar
{
//do stuff//
}
Progress-bar.html
<template>
<link rel="stylesheet" type="text/css" href="src/components/progress-bar.css">
<div class='progress-bar' tabindex=0 ref="bar">bloo</div>
</template>
test.html (relevanten Teil)
<require from="./components/progress-bar"></require>
<progress-bar ref="pb">a</progress-bar>
All dies zeigt sich in Ordnung. Aber ich kämpfe darum, wie man die Hauptseite aufrufen kann, um eine Funktion aufzurufen oder ein Attribut für ein Element zu ändern, das dann etwas auf dem Fortschrittsbalken selbst machen sollte.
Ich habe versucht, eine Funktion 'doSomething' in der progress-bar.js zu erstellen, aber ich kann nicht in test.js zugreifen.
hinzugefügt, um die Fortschritte-bar.js
doSomething(percent, value) {
$(this.bar).animate('width: ${percent}%', speed);
}
innen test.js
clicked() {
console.log(this.pb); // this returns the progress bar element fine
console.log(this.pb.doSomething); //this returns as undefined
this.pb.doSomething(percent, value); // this fails outright with error: typeError - doSomething is not a function
}
Next I Setup benutzerdefinierte versucht Attribute innerhalb Fortschritt-Stabelement und vielleicht Valuechange verwenden, um die div stattdessen zu ändern .
Innen Fortschritt-bar.js
@bindable percent=null;
@bindable speed=null;
test.js
clicked() {
this.pb.percent=50; //this updated fine
this.pb.speed=1500; //this updated fine
}
Kein Problem da, fast da. Aber wie richte ich einen Handler ein, der aufgerufen werden soll, wenn sich ein Attribut ändert?
fand ich ein Tutorial, das diese Syntax hatte:
@bindable({
name:'myProperty', //name of the property on the class
attribute:'my-property', //name of the attribute in HTML
changeHandler:'myPropertyChanged', //name of the method to invoke on property changes
defaultBindingMode: ONE_WAY, //default binding mode used with the .bind command
defaultValue: undefined //default value of the property, if not bound or set in HTML
})
Aber ich kann nicht, dass Code in meinem Fortschritt-bar.js zu verwenden scheinen. Die Seite nicht richtig zu machen, nachdem ich hinzufügen, dass in Gulp scheint keine Fehlermeldungen zurückgegeben zu haben, aber die Browser-Konsole gibt diesen Fehler zurück.
ERROR [app-router] Router navigation failed, and no previous location could be restored.
, die die Nachricht, die ich normalerweise, wenn ich habe irgendwo auf meinen Seiten einen Syntaxfehler.
Es gibt viele Dinge, die ich bin nicht sicher, hier:
Ist dies die richtige Verwendung für benutzerdefinierte Elemente? Können wir benutzerdefinierte Elemente mit Funktionen in ihnen erstellen? Können wir benutzerdefinierte Elemente mit benutzerdefinierten Attributen erstellen, die dann Ereignisse auslösen können, wenn sich ihre Werte ändern?
Entschuldigung dafür, dass ich keine ganzen Codes gepostet habe, da ich so viele Variationen davon habe, während ich verschiedene Dinge ausprobiere.
Ich fand es heraus. this.pb verweist auf das Element progress-bar. Darin befindet sich ein progressBar-Objekt der Klasse ProgressBar. Um also auf Funktionen innerhalb der benutzerdefinierten Elementklasse zuzugreifen, muss die this.pb.progressBar und die Attribute identisch sein. –
Wenn Sie Ihr Problem beantwortet haben, können Sie Ihre tatsächliche Lösung posten und dann als Antwort markieren? – Andrew