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.

Der Code

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 Problem

Die 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 dasfocusoutas @ -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 Frage

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage