Bidirektionale Bindung in einem benutzerdefinierten Aurelia-Attribut
AKTUALISIEREN Es sieht so aus, als wäre dies ein bekannter Fehler:https: //github.com/aurelia/templating/issues/25
Ich lasse es hier zu Referenz- / Suchzwecken.
input-mask.ts (Vollständiger Code ist zu sehenHie)
@customAttribute('input-mask')
@inject(Element)
export class InputMaskCustomAttribute {
@bindable({ defaultBindingMode: bindingMode.twoWay,
changeHandler: 'onUnmaskedValueChanged' })
unmaskedValue: any;
onUnmaskedValueChanged(newValue, oldValue) {
console.log('unmaskedValue updated from inside the custom attribute');
}
@bindable
mask: string;
attached() {
this.eventTarget.on('focusout', (e: any) => {
this.unmaskedValue = (<any>$(this.element)).cleanVal()
this.fireEvent(e.target, 'input');
});
}
// Code for constructor, fireEvent and to setup the mask...
}
carrier.html
<input input-mask="mask.bind: carrier.airbillMask; unmasked-value.bind: airbill"
value.bind="formattedAirbill"/>
AKTUALISIEREN Um diesen Fehler zu umgehen, wechseln Sie zuunmasked-value.two-way
und die Bindung wird funktionieren.
carrier.ts
@bindable({ defaultBindingMode: bindingMode.twoWay})
carrier: EntityInterfaces.ICarrier;
@bindable({ defaultBindingMode: bindingMode.twoWay })
formattedAirbill: string;
@bindable({ defaultBindingMode: bindingMode.twoWay, changeHandler: 'onAirbillChanged' })
airbill: string;
onAirbillChanged() {
console.log('Airbill was set!');
}
Das ProblemDie Daten scheinen in das @ zu fließ@bindable
Variable ganz gut. Wenn sich die Maske ändert, wird der Wert im benutzerdefinierten Attribut geändert.
Aber es scheint nicht herauszufließen, wenn Änderungen innerhalb des benutzerdefinierten Attributs vorgenommen werden.
Beispielszenario: Nachdem ich den Wert im Eingabefeld bearbeitet und die Eingabe beendet habe, wird dasfocusout
as @ -Ereignis wird ausgelöst und die Konsolenanweisung, die angibt, dass der nicht maskierte Wert aus dem benutzerdefinierten Attribut heraus aktualisiert wurde, wird ausgegeben:
unmaskedValue aktualisiert aus dem benutzerdefinierten Attribut
Aber (wenn die Eingabe den Fokus verliert) die Konsolenanweisung, die besagt, dass dasairbill
in der carrier.ts-Datei, die aktualisiert wurde, wird nicht ausgelöst, wenn ich das Eingabefeld verlasse:
Dies wird nicht ausgelöst:
console.log ('Airbill wurde gesetzt!');
Dies scheint mir zu zeigen, dass die Bindung nicht wirklich wechselseitig ist.
Die FrageWie kann ich diese Bindung in beide Richtungen herstellen? Also, wenn ich @ updaunmaskedValue
innerhalb des benutzerdefinierten Attributs wird der gebundene Wert im Ansichtsmodell aktualisiert?
Hinweis: Als Workaround konnte ich @ ändeunmasked-value.bind
um ein Methodenaufruf zu sein on-unmasked-value-changed.call="onUnmaskedValueChanged($event)
) und aktualisieren Sie den Wert in dieser Methode. Also brauche ich das nicht, um zu arbeiten. Ich würde aber gerne wissen, ob es für die Zukunft möglich ist.