我正在尝试与ckeditor一起工作,作为可观察到的基因敲除(knockout.js),并且遇到了一些麻烦。首先是我的代码:
ko.bindingHandlers.CKEDITOR = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var ckEditorValue = valueAccessor();
var id = $(element).attr('id');
var options = allBindings().EditorOptions;
var instance = CKEDITOR.replace(id, {
on: {
change: function () {
// This moves the caret to the start of the editor on each key pressed
ckEditorValue(instance.getData());
}
}
});
// instance.setData(ckEditorValue());
},
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var id = $(element).attr('id');
var ckEditorValue = valueAccessor();
CKEDITOR.instances[id].setData(ckEditorValue());
}
};
我在使用此代码时遇到的问题是,在我按下的每个键上,change
事件触发了插入符号移动到编辑器的上端开始位置。我尝试调用blur
事件而不是change
事件,但单击“保存”按钮时不会触发,仅当单击空白位置或移至其他控件时才会触发。
那我该如何保持我的观测值更新呢?
我在其他编辑器中遇到了类似的问题,并通过删除update
处理程序并将其替换为手动订阅来解决了该问题。这样,您可以引入一些共享状态,说“跳过此更新,就是我”:
ko.bindingHandlers.CKEDITOR = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var ckEditorValue = valueAccessor();
var id = $(element).attr('id');
var options = allBindings().EditorOptions;
var ignoreChanges = false;
var instance = CKEDITOR.replace(id, {
on: {
change: function() {
ignoreChanges = true;
ckEditorValue(instance.getData());
ignoreChanges = false;
}
}
});
ckEditorValue.subscribe(function(newValue) {
if (!ignoreChanges) {
instance.setData(newValue);
}
});
}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句