événement lostfocus / onblur en knockout

je veux exécuter un événement sur un knock-out observable lié à un input. Cette fonction doit être exécutée lorsque le contrôle perd la mise au point, même sans taper quoi que ce soit. J'ai essayé de changer la reliure d'événement, mais ça ne marche pas quand l'utilisateur s'éloigne du contrôle sans rien taper. J'ai essayé l'événement mouseout, mais cela ne se déclenche que lorsque l'utilisateur clique ailleurs dans le formulaire, après avoir perdu la mise au point - pas exactement ce que je veux. Je veux que le même feu dès que la mise au point est éloignée de le contrôle, même avec la touche tab.

<!-Voici le code que j'ai utilisé pour mouseout event:

<input
    type="text"
    id="txtFirstName"
    tabindex="1"
    maxlength="25"
    class="txtbox" 
    style="width: 200px;"
    data-bind="value: FirstName, 
               attr: {title: FirstNameErrorMessage },
               css: {validationFailed: !IsValidFirstName() },
               event: {mouseout: ValidateFirstName}" 
/>

this.ValidateFirstName = function () {
    self.IsValidFirstName(true);
    self.FirstNameErrorMessage('');
    if (self.FirstName() == '') {
        self.IsValidFirstName(false);
        self.FirstNameErrorMessage('First Name is required');
    }
}

quelqu'un Peut-il aider s'il vous plaît?

25
demandé sur Gab 2013-04-19 13:44:44

6 réponses

je pense qu'il y a quelques approches que vous pouvez utiliser. Une bonne option serait d'utiliser KO's hasfocus reliure:http://knockoutjs.com/documentation/hasfocus-binding.html.

vous pouvez vous lier à un booléen observable, puis vous y abonner. Dans l'abonnement, vous pouvez choisir de ne réagissent que lorsque la valeur est maintenant faux.

quelque Chose comme:

self.FirstName = ko.observable();
self.FirstName.focused = ko.observable();

self.FirstName.focused.subscribe(function(newValue) {
   if (!newValue) {
       //do validation logic here and set any validation observables as necessary
   }
});

lid against it like:

data-bind="value: FirstName, hasfocus: FirstName.focused"

je pense que ce serait une bonne option si vous voulez que le feu chaque fois que l'utilisateur quitte le terrain, peu importe comment ils la quittent et qu'une modification a été faite.

31
répondu RP Niemeyer 2016-04-20 14:41:13

j'aime la réponse de @RPNiemeyer. Cependant, je voulais juste souligner que pas tout doit être fait par Ko. C'est juste un outil, et parfois, il n'est pas le meilleur outil pour le travail. Vous pouvez toujours utiliser la liaison directe d'événement comme vous l'avez toujours fait dans JS, i.e.

$('#FirstName').on('blur', function () {
    // do something
});

si vous devez réellement interagir avec votre modèle de vue, alors vous pouvez simplement utiliser ko.dataFor comme décrit dans la documentation de Knockout sur l'événement délégation:

$('#FirstName').on('blur', function () {
    var data = ko.dataFor(this);
    // do something with data, i.e. data.FirstName()
});
21
répondu Chris Pratt 2013-04-19 14:55:00

Cela a fonctionné pour moi:

data-bind="event: { blur: OnBlurEvent }"
18
répondu arntjw 2014-08-20 10:08:59

je viens d'avoir le même problème, résolu en créant une reliure personnalisée:

ko.bindingHandlers.modifyOnFocusOut = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        $(element).blur(function() {
            //Do your work
        });
    }
}

Et ensuite appelé comme ceci:

 data-bind="value: FirstName, modifyOnFocusOut: FirstName"
5
répondu jfc37 2013-07-14 05:14:58

Avez-vous essayé event:{blur: ValidateFirstName} cet événement sera déclenché si l'utilisateur clic ou " tab " de l'entrée.

<input
    type="text"
    id="txtFirstName"
    tabindex="1"
    maxlength="25"
    class="txtbox" 
    style="width: 200px;"
    data-bind="value: FirstName, 
               attr: {title: FirstNameErrorMessage},
               css: {validationFailed: !IsValidFirstName()},
               event: {blur: ValidateFirstName}"

Voici un JSFiddle un exemple de travail.

3
répondu Gab 2014-10-25 14:32:44
module Fx.Ko.Bindings {
    export class SetFocusBinding implements KnockoutBindingHandler {
        public update(element, valueAccessor, allBindingsAccessor) {
            var value = valueAccessor();
            var valueUnwrapped = ko.unwrap(value);
            if (valueUnwrapped == undefined) {
                return;
            }
            if (valueUnwrapped)
                $(element).focus();
        }
    }
}

et ...

    module Fx.Ko.Bindings {
        export class OnBlurBinding implements KnockoutBindingHandler {
            public init(element, valueAccessor, allBindings, viewModel, bindingContext) {
                var value = valueAccessor();
                $(element).on('blur', function (event) {
                    value();
                });
            }
        }
    }
interface KnockoutBindingHandlers {
    onBlur: KnockoutBindingHandler;
}
ko.bindingHandlers.onBlur = new Fx.Ko.Bindings.OnBlurBinding();
0
répondu Paul0515 2015-06-16 09:44:34