Я пытаюсь внедрить TinyMCE в шаблон HotSpa Джона Папы.
Сейчас я использую Knockout 3.1.0 и Durandal 2.0.
По какой-то неизвестной причине мой собственный метод инициализации привязки нокаута запускается только один раз при первой загрузке и дважды при обновлении представления.
Под обновлением я подразумеваю использование маршрутизатора Durandal, я снова перешел к тому же представлению (но с другими параметрами). Он еще прошел весь жизненный цикл дурандаля, крюки отсоединяемого и присоединяемого вызываются снова.
У меня был код отладки, где второй вызов вернул .editors.length = 1
, что означает, что редактор уже был инициализирован при первом вызове.
Примечание. Внутри метода инициализации у меня есть метод ko.utils.domNodeDisposal.addDisposeCallback
, и по какой-то причине он вызывается после второго вызова инициализации. Я закомментировал это, но tinyMCE по-прежнему исчезает. Я просмотрел редакторы и заметил, что он считается скрытым. isHdidden = true
.
<textarea id="mytinymce" class="tinymce"
data-bind="attr: {id: FieldId}, tinymce: FieldValue”></textarea>
Страница изначально правильно загружается с помощью элемента управления TinyMCE, однако после обновления экрана происходит сбой.
Я ухожу от представления и обратно.
ko.bindingHandlers.tinymce = {
init: function (element, valueAccessor, allBindingsAccessor,
context, arg1, arg2) {
var options = allBindingsAccessor().tinymceOptions || {};
var modelValue = valueAccessor();
var value = ko.utils.unwrapObservable(valueAccessor());
var el = $(element);
var id = el.attr('id');
//options.theme = "advanced";
options.theme = "modern";
options.menubar = false;
options.plugins = [
"advlist autolink autosave link image lists charmap print preview hr anchor pagebreak spellchecker",
"searchreplace wordcount visualblocks visualchars code fullscreen insertdatetime media nonbreaking",
"table contextmenu directionality template textcolor paste fullpage textcolor"
];
//tinymce buttons
//http://www.tinymce.com/tryit/classic.php
options.toolbar_items_size = 'small';
options.toolbar1 =
"bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | forecolor backcolor | hr removeformat | subscript superscript ";
////handle edits made in the editor. Updates after an undo point is reached.
options.setup = function (editor) {
editor.on('change', function (e) {
if (ko.isWriteableObservable(modelValue)) {
var content = editor.getContent({ format: 'raw' });
modelValue(content);
}
});
};
el.html(value);
$(element).tinymce(options);
//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
var tinymceInstance = tinyMCE.get(id);
if (tinymceInstance != undefined) {
// if instance already exist, then get rid of it... we don't want it
tinymceInstance.remove();
}
});
},
update: function (element, valueAccessor, allBindingsAccessor,
context) {
var el = $(element);
var value = ko.utils.unwrapObservable(valueAccessor());
var id = el.attr('id');
//handle programmatic updates to the observable
// also makes sure it doesn't update it if it's the same.
// otherwise, it will reload the instance, causing the cursor to jump.
if (id !== undefined) {
//$(el).tinymce();
var tinymceInstance = tinyMCE.get(id);
if (!tinymceInstance)
return;
var content = tinymceInstance.getContent({ format: 'raw' });
if (content !== value) {
//tinymceInstance.setContent(value);
valueAccessor(content);
//$(el).html(value);
}
}
}
};
К сожалению, я не вижу никаких ошибок в консоли, но редактор (включая текстовую область) скрыт и не виден.
init
при первом ее вводе и проверить, настроена ли она для запуска кода только тогда, когда это не так? - person GôTô   schedule 12.06.2014