У меня есть следующий код, где я пытаюсь использовать записываемый для просмотра наблюдаемый для проверки ввода пользователя и автоматического отклонения недопустимого ввода. Это всего лишь некоторый тестовый код, где я пытаюсь запретить пользователю удалять символ запятой из текста. Если пользователь удаляет запятую, я пытаюсь перефразировать редактор до предыдущего значения, чтобы перезаписать последнее изменение. Возможно ли это, используя записываемое вычисленное поле? Проблема, с которой я сталкиваюсь, заключается в том, что перезаписываемая вычисленная привязка срабатывает только при загрузке страницы (после ручной установки подсказки ValidText). Однако я не могу ее запустить, когда пользователь вводит в редактор.KnockoutJS: Writable вычисляемый наблюдаемый, не обновляющийся
Код:
<script type="text/javascript">
var model = null;
function EditModel() {
this.Count = 2;
var self = this;
this.ExistingValue = ko.observable("");
this.ValidText = ko.computed({
read: function() {
return self.ExistingValue();
},
write: function (text) {
if (text.split(',').length === self.Count) {
self.ExistingValue(text);
}
},
owner: self
});
}
$(document).ready(function() {
model = new EditModel();
model.ValidText('@(Model.Text)');
ko.applyBindings(model);
});
</script>
<div id="mainContainer">
<div id="editor" contenteditable="true" class="commentEditBox" data-bind="text: ValidText, valueUpdate: 'afterkeydown'" ></div>
</div>
Законченное происходит с пользовательской привязки идеи и превращали код на следующее:
<script type="text/javascript">
var model = null;
ko.bindingHandlers.customEditorBinding = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
$(element).on('keydown', function() {
var observable = valueAccessor();
observable($(this).text());
});
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var text = ko.utils.unwrapObservable(valueAccessor());
if (text.split(',').length === model.Count) {
model.ValidText(text);
model.PreviousText = text;
$(element).text(text);
}
else {
model.ValidText(model.PreviousText);
$(element).text(model.PreviousText);
}
}
};
function EditModel() {
var self = this;
self.Count = 2;
self.ValidText = ko.observable("");
self.PreviousText = null;
}
$(document).ready(function() {
model = new EditModel();
model.ValidText('This is,a test');
ko.applyBindings(model);
});
</script>
<div id="mainContainer">
<div id="editor" contenteditable="true" class="commentEditBox" data-bind="customEditorBinding:ValidText" ></div>
</div>
Я согласен, что это противоречиво, но это не должно иметь значения. Я обновил его, чтобы использовать «я» для всех из них, но все равно та же проблема – TGH
Справедливо, но я всегда ищу простейшие объяснения, и несоответствия - это хорошее место для начала! Во всяком случае, попробуйте этот ответ. –
Хорошо, круто, я получил его на работу. Спасибо за идею. – TGH