2015-10-20 2 views
0

Я пытаюсь реплицировать двухсторонний пример привязки данных на AngularJS website.Vanilla Javascript текстовое поле привязки данных, как AngularJS

Вот мой код (в JQuery языке для краткости):

$('#model-textbox').on('keyup', function(){ 
    //get value of text box 
    var text_box_str = $(this).val(); 

    //add it to the view 
    $('#view-div').html(text_box_str); 
}); 

Он работает, как ожидалось, но там, кажется, какой-то задержки с момента отпускания клавиши, чтобы при отображении текста , Эта задержка не происходит на примере сайта AngularJS.

Я пробовал вариант события «keydown» (который заботится о задержке), но похоже, что значение текстового поля не обновляется до вызова .val() (так что я всегда нажимаю один раз позади).

Как добиться быстрого просмотра обновлений с использованием keyup, keydown или любым другим способом?

+0

https://jsfiddle.net/gu p9atf0/ –

+0

@JonahWilliams Это работает! Пожалуйста, напишите как ответ –

ответ

2

Связать с input, чтобы получить немедленную синхронизацию. https://developer.mozilla.org/en-US/docs/Web/Events/input

var $view = $('#view-div'); 
var ie9 = navigator.appVersion.indexOf("MSIE 9.")!=-1; 
var event = ('oninput' in document.documentElement && !ie9) && 'input' || 'keypress'; 

$('#model-textbox').on(event, function(){ 
    var $el = $(this); 
    if(event === 'keypress') { 
     setTimeout(function(){ $view.text($el.val()); },0); 
    } else { 
     $view.text($el.val()); 
    } 
}); 

Кроме того, проверка из RivetsJS за небольшую библиотеку, которая поддерживает эту функцию вне Угловое. http://rivetsjs.com

Edit: Добавлена ​​проверка поддержки событие, чтобы принять вас обратно мимо IE9

+0

даже IE9 имеет оговорки .. забудьте точно, что это такое, но я думаю, что он игнорирует backspace – charlietfl

+0

Да, добавила записку об этом. Метод обнаружения браузера будет подходящим, а затем просто используйте 'input keyup' в качестве события. Вы получаете двойное исполнение, но это справедливый компромисс. –

+0

@dboskovic Спасибо. Я попробовал '.on ('input keyup')', и он отлично работает! Будет протестировать IE-браузеры и настроить по мере необходимости. Есть ли разница между этим и вашим кодом? –

0

Я не вижу, что большая задержка, но это может помочь (если вы заботитесь о таких вещах.) если вы кэшировать объекты Jquery (чем больше DOM, тем более, что это поможет):

var $view = $('#view-div'); 
var $box = $('#model-textbox'); 
$box.on('keyup', function(){ 
    //get value of text box 
    var text_box_str = $box.val(); 

    //add it to the view 
    $view.html(text_box_str); 
}); 

https://jsbin.com/ruxajowolo/edit?html,js,output

+0

определенно помогите ... не требует домашнего поиска для каждого нажатия клавиши. «$ Box» не будет иметь никакого значения, хотя ... '$ view' будет. 'this.value' еще эффективнее, чем использование jQuery – charlietfl

+0

Проблема, с которой она сталкивается, решается путем привязки к событию' input'. –

+0

@dboskovic осторожно, но событие не поддерживается в старых браузерах http://caniuse.com/#search=input – charlietfl

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