Ваш массив objects
содержит только простые javascript объекты, представляющие сериализованные объекты Fabri c (например, путь, круги и т. Д.).
Перед рендерингом этих простых javascript объектов, которые необходимо преобразовать их в Фабри c объектах. Этот процесс называется десериализацией. Ваш код делает это, но только если свойство async
переменной klass
имеет значение true. Это происходит здесь:
var klass = fabric.util.getKlass(objects[i].type);
if (klass.async) {
klass.fromObject(objects[i], function (img) {
canvas1.add(img);
});
}
Объект десериализован, передан в качестве аргумента функции обратного вызова, а затем добавлен на холст, и это здорово.
Проблема в другом ветка ваша условная, где ничего этого не происходит. Единственный существующий код - это:
else {
console.log(objects[i]);
canvas1.add((objects[i]));
}
Здесь вы пытаетесь добавить простой объект на холст, и это вызывает ошибку. Одно простое решение - удалить if / else
и всегда выполнять этап десериализации. Если по другим причинам вам необходимо поддерживать условное выражение if / else
, вы можете просто десериализовать объект и в другом пути.
Вот работающий Fiddle , который сохраняет условное выражение.
Почему он работал в предыдущей версии Fabri c? Трудно сказать. Может быть, этот тип объекта был помечен как asyn c, так что запуск правильного пути. Или, может быть, метод canvas.add
автоматически десериализует javascript объектов.