KnockoutJS - Event Binding
Essa ligação é usada para ouvir um evento DOM específico e chamada associada à função do manipulador com base nele.
Syntax
event: <{DOM-event: handler-function}>
Parameters
O parâmetro inclui um objeto JavaScript, contendo o evento DOM que será ouvido e uma função de manipulador que precisa ser chamada com base nesse evento. Essa função pode ser qualquer função JavaScript e não precisa ser necessariamente a função ViewModel.
Example
Vamos dar uma olhada no exemplo a seguir, que demonstra o uso da associação de eventos.
<!DOCTYPE html>
<head>
<title>KnockoutJS Event Binding</title>
<script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
type = "text/javascript"></script>
</head>
<body>
<p>Enter Number :</p>
<input data-bind = "value: someValue , event: {keyup: showMessage},
valueUpdate: 'afterkeydown' " /><br><br>
You Entered: <span data-bind = "text: someValue"/>
<script type = "text/javascript">
function ViewModel () {
this.someValue = ko.observable();
this.showMessage = function(data,event) {
if ((event.keyCode < 47) || (event.keyCode > 58 )) { //check for number
if (event.keyCode !== 8) //ignore backspace
alert("Please enter a number.");
this.someValue('');
}
}
};
var vm = new ViewModel();
ko.applyBindings(vm);
</script>
</body>
</html>
Output
Vamos realizar as seguintes etapas para ver como funciona o código acima -
Salve o código acima em event-bind.htm Arquivo.
Abra este arquivo HTML em um navegador.
Tente digitar qualquer valor não numérico e você receberá um alerta.
Observações
Passando um item atual como um parâmetro para a função de manipulador
KO irá passar o item atual como parâmetro ao chamar a função de tratamento. Isso é útil ao trabalhar com uma coleção de itens e precisa trabalhar em cada um deles.
Example
Vamos dar uma olhada no exemplo a seguir, no qual o item atual é passado na associação de eventos.
<!DOCTYPE html>
<head>
<title>KnockoutJS Event Binding - passing current item </title>
<script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
type = "text/javascript"></script>
</head>
<body>
<ul data-bind = "foreach: icecreams">
<li data-bind = "text: $data, event: { mouseover: $parent.logMouseOver }"> </li>
</ul>
<p>You seem to be interested in: <span data-bind = "text: flavorLiked"> </span></p>
<script type = "text/javascript">
function ViewModel () {
var self = this;
self.flavorLiked = ko.observable();
self.icecreams = ko.observableArray(['Vanilla', 'Pista', 'Chocolate',
'Mango']);
// current item is passed here as the first parameter, so we know which
// flavor was hovered over
self.logMouseOver = function (flavor) {
self.flavorLiked(flavor);
}
};
var vm = new ViewModel();
ko.applyBindings(vm);
</script>
</body>
</html>
Output
Vamos realizar as seguintes etapas para ver como funciona o código acima -
Salve o código acima em event-bind-passing-curr-item.htm Arquivo.
Abra este arquivo HTML em um navegador.
Flavor, que tem o mouse sobre ele, é exibido.
Observe que self como um alias é usado para isso. Isso ajuda a evitar problemas com isso sendo redefinido para outra coisa nos manipuladores de eventos.
Passando mais parâmetros ou referindo-se ao objeto de evento
Pode haver uma situação em que você precise acessar o objeto de evento DOM associado ao evento. KO passa o evento como um segundo parâmetro para a função de manipulador.
Example
Vamos dar uma olhada no exemplo a seguir, no qual o evento é enviado como um segundo parâmetro para funcionar.
<!DOCTYPE html>
<head>
<title>KnockoutJS Event Binding - passing more params</title>
<script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
type = "text/javascript"></script>
</head>
<body>
<div data-bind = "event: { mouseover: logMouseOver }">
Press shiftKey + move cursor over this line.
</div>
<script type = "text/javascript">
function ViewModel () {
self.logMouseOver = function (data, event) {
if (event.shiftKey) {
alert("shift key is pressed.");
} else {
alert("shift key is not pressed.");
}
}
};
var vm = new ViewModel();
ko.applyBindings(vm);
</script>
</body>
</html>
Output
Vamos realizar as seguintes etapas para ver como funciona o código acima -
Salve o código acima em event-bind-passing-more-params.htm Arquivo.
Abra este arquivo HTML em um navegador.
Pressione shiftKey + mova o cursor para o texto. Observe que a mensagem aparecerá mostrando se você pressionou a tecla shift.
Permitindo ação padrão
O Knockout evitará que o evento execute qualquer ação padrão, por padrão. Ou seja, se você usar o evento de pressionamento de tecla para uma tag de entrada, KO apenas chamará a função do manipulador e não adicionará o valor da chave ao valor dos elementos de entrada.
Se você quiser que o evento execute uma ação padrão, basta retornar true da função de manipulador.
Example
Vejamos o exemplo a seguir, que permite que a ação padrão ocorra.
<!DOCTYPE html>
<head>
<title>KnockoutJS Event Binding - allowing default action</title>
<script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
type = "text/javascript"></script>
</head>
<body>
<p>Enter the flavor you like from available menu: (Vanilla, Pista, Chocolate,
Mango)</p>
<input data-bind = "event: { keypress: acceptInput}"></input>
<script type = "text/javascript">
function ViewModel () {
self.acceptInput = function () {
return true;
}
};
var vm = new ViewModel();
ko.applyBindings(vm);
</script>
</body>
</html>
Output
Vamos realizar as seguintes etapas para ver como funciona o código acima -
Salve o código acima em event-bind-default-action.htm Arquivo.
Abra este arquivo HTML em um navegador.
Qualquer tecla pressionada é realmente mostrada na caixa de entrada porque a função do manipulador retorna true.
Evitando que o evento borbulhe
KO permitirá que o evento borbulhe para os manipuladores de eventos de nível superior. Ou seja, se você tiver dois eventos de mouseover aninhados, a função de manipulador de eventos para ambos será chamada. Se necessário, esse borbulhamento pode ser evitado adicionando uma ligação extra chamada youreventBubble e passando um valor falso para ela.
Example
Vamos dar uma olhada no exemplo a seguir em que o borbulhamento é tratado.
<!DOCTYPE html>
<head>
<title>KnockoutJS Event Binding - preventing bubbling </title>
<script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
type = "text/javascript"></script>
</head>
<body>
<div data-bind = "event: { mouseover: myParentHandler }">
<button data-bind = "event: { mouseover: myChildHandler },
mouseoverBubble: false">Click me to check bubbling.</button>
</div>
<script type = "text/javascript">
function ViewModel () {
var self = this;
self.myParentHandler = function () {
alert("Parent Function");
}
self.myChildHandler = function () {
alert("Child Function");
}
};
var vm = new ViewModel();
ko.applyBindings(vm);
</script>
</body>
</html>
Output
Vamos realizar as seguintes etapas para ver como funciona o código acima -
Salve o código acima em event-bind-prevent-bubble.htm Arquivo.
Abra este arquivo HTML em um navegador.
Mova o botão do mouse e você verá uma mensagem. A formação de bolhas é evitada devido ao uso de mouseoverBubble definido como false.