Форма автозаполнения (Norton Identity Safe) не обновляет наблюдаемое значение нокаута
У меня есть форма входа, которая использует Knockout.js для значений TS.
Разобранный пример кода:
<input id="username" placeholder="Email" data-bind="textInput: Profile.Email" required />
<input id="password" type="password" placeholder="Password" data-bind="textInput: Profile.Password" required />
var Profile = function () {
self.Email = ko.observable('');
self.Password = ko.observable('');
}
Когда такая программа, как Norton Identity Safe, менеджер паролей, автоматически заполняет вашу регистрационную информацию (я не смог проверить другие источники автозаполнения), наблюдаемые для Profile.Email и Profile.Password не обновляются. Если я щелкну в поле и укажу фокус поля, а затем покину поле, значение все еще не обновится. Только когда я добавляю или удаляю символ, поле обновляется.
Я видел некоторые другие темы о том, как "взломать" способ обойти это, но все они до KO 3.2.0, который включал textInput
Привязка, которая выглядит так, как будто должна решить эту проблему, но это не так.
Есть ли какая-либо причина, по которой textInput не обновляет наблюдаемое значение при автозаполнении, и были ли какие-либо новые способы получения значения для обновления, которые не являются настолько "хакерскими".
1 ответ
Если только change()
срабатывает триггер, нокаут не увидит обновленное значение ввода. Вот небольшая демонстрация, с которой вы можете играть. Если флажок установлен, change
триггер срабатывает после обновления значения, а затем наблюдаемое значение изменяется.
vm = {
uname: ko.observable('initial'),
changeIt: function() {
var $el = $('#username').val('changed!');
if (vm.doTrigger()) {
$el.change();
}
},
doTrigger: ko.observable(false)
};
ko.applyBindings(vm);
vm.uname.subscribe(function(newValue) {
console.debug("Changed:", newValue);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input id="username" data-bind="textInput: uname" />
<div data-bind="text:uname"></div>
<button data-bind="click:changeIt">Change It</button>
Trigger it: <input type="checkbox" data-bind="checked: doTrigger" />
Смотрите также: Обновление поля с помощью jquery не обновляет наблюдаемый