2016-11-18 2 views
0

Я пытаюсь включить функцию поиска, когда пользователь нажимает кнопку ввода с помощью нокаута , но когда я нажимаю войти в текстовом поле, нокаут не связывает значение из textboxНокаут нажатие клавиши не связывается при нажатии ввода

<!DOCTYPE html> 
<html> 
<head> 
    <title>Knockout</title> 
    <meta charset="utf-8" /> 
</head> 
<body> 
    <div id="view"> 
     <input type="text" placeholder="Press enter to bind" data-bind="value:textboxValue" data-function="pressEnterToBind"/> 
    </div> 
</body> 
</html> 
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 
<script src="http://knockoutjs.com/downloads/knockout-3.4.1.js"></script> 
<script> 
    $(document).ready(function() { 
     window.vm = (function ($, ko) { 
      var $view = $("#view"); 
      var textboxValue = ko.observable(); 

      var onPressEnter = function (e) { 
       if (e.which === 13) { 
        alert(textboxValue()); 
       } 
      }, 
      init = function() { 
       $view.on('keypress', '[data-function="pressEnterToBind"]', onPressEnter); 
      }; 

      init(); 

      return { 
       textboxValue: textboxValue 
      }; 
     }($, ko)); 

     window.vm.binding = (function (ko, vm) { 
      ko.applyBindings(vm); 
     })(ko, window.vm); 
    }); 
</script> 

Результатов для оповещения является «неопределенным»

+0

Вместо нажатия клавиши вы пытались работать с keydown? Вот как я поймаю непечатаемые ключи, такие как enter, backspace, tab и т. Д. – Bindrid

+0

Да, но результаты одинаковы –

+0

Я думаю, что ваш код сложнее, чем нужно. Например, почему вы не привязываете элемент управления сразу после создания представления? BTW, textInput лучше привязывать текстовые поля, чем значение. Или, если вы действительно хотите захватить ключевые штрихи, создайте свою собственную привязку. – Bindrid

ответ

0

Я достиг своей цели двумя путями

Во-первых: добавление «valueUpdate:" afterkeydown»нокаутировать связывания

<input type="text" placeholder="Press enter to bind" data-bind="value:textboxValue,valueUpdate: 'afterkeydown'" data-function="pressEnterToBind"/> 

ИЛИ

Во-вторых: "размывание()" и "фокус()" снова на целевой контроль

  var onPressEnter = function (e) { 
       if (e.which === 13) { 
        $(e.target).blur(); // to refresh ko binding 
        alert(textboxValue()); 
        $(e.target).focus(); // to refresh ko binding 
       } 
      }, 
0

TextInput связывание может решить эту проблему.

KnockoutJS документация:

В отличии от связывающего значения, TextInput обеспечивает мгновенные обновления от DOM для всех типов ввода данных пользователя, в том числе автозаполнения, перетащить и падение, и буфер обмена событий.

Смежные вопросы