Nach einigem Graben in ng-Modell ein bisschen mehr, fand ich, dass ngModel für textbasierte < Eingänge > aktualisiert nicht die ngModleControllers$viewValue
, wenn ein Composition Event wird gerade ausgeführt (dies wird von Dragon ausgelöst, wenn es sich im 'Zauber'-Modus befindet). Ich fand später ngModelOptions und versuchte, es zu verwenden, aber das Commits Änderungen an $viewValue
und nicht Änderungen von der tatsächlichen <Eingabe>.
Für unser Szenario würde der Benutzer normalerweise drücken Sie die ‚Enter‘ Taste um den Inhalt des Textfeldes zu unterbreiten, so haben wir die folgende Direktive unserer Situation
directive('sqEnter', ['$timeout',function ($timeout) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var composing = false;
element.on('compositionstart', function (data) {
composing = true;
});
element.on('compositionend', function() {
composing = false;
});
element.on('keydown keypress', function (event) {
if (event.which === 13) {
event.preventDefault();
if (composing) {
element.trigger('compositionend');
$timeout(handler, 5);
}
else handler();
}
});
function handler() {
scope.$apply(function() {
scope.$eval(attrs.sqEnter);
});
}
}
}
}]);
Verbrauch zu beheben: <input type='text' ng-model='myValue' sq-enter='doSomething()' />
.
Die wichtige Sache hier war, das compositionend
Ereignis auszulösen, wenn passend, also aktualisiert das Modell richtig.
Sie müssen diese Funktionalität wahrscheinlich in eine Direktive einfügen (dies ist der einzige Ort, an dem die DOM-Manipulation nach AngularJS-Mustern erfolgen sollte). Es wäre nützlich, wenn Sie einen Codeteil teilen könnten, um Alternativen besser vorzuschlagen. –