Вы правы, проблема в том, что вы восстанавливаете холсты, загружая json, который явно содержит неправильное значение свойства fill
:
"fill":{"ok":true,"format":"hex6","_tc_id":258,"alpha":1}
возможно, этот объект появился в результате сериализации TinyColor.
К сожалению, Fabricjs не может правильно интерпретировать это и не может преобразовать обратно в шестнадцатеричный цвет (см. источники TinyColor, если вам нужно углубиться в этот момент)
Я создал эту fiddle, чтобы показать, как можно воспроизвести подобную ошибку; предположим, что у нас есть TinyColor
var t = tinycolor("#ff0000");
Мы совершаем ошибку, если используем этот объект TinyColor в качестве значения свойства заливки (т. е. fill: t
), например:
canvas.add(new fabric.Rect({ width: 50, height: 50, fill: t, top: 100, left: 100 }));
сериализуя холст, мы получаем JSON, который содержит:
"fill":{"ok":true,"format":"hex","_tc_id":0,"alpha":1},
но это не может работать, и фактический fill
визуализируется как черный (по умолчанию) вместо нашего цвета (красный).
Правильный подход заключается в использовании fill: t.toHexString()
:
canvas.add(new fabric.Rect({ width: 50, height: 50, fill: t.toHexString(), top: 150, left: 150 }))
это работает нормально (прямоугольник красный), кроме того, сериализуя холст, мы получаем JSON, который содержит:
"fill":"#ff0000"
поэтому это будет работать нормально, даже если вы будете восстанавливать холсты из JSON.
ИЗМЕНИТЬ
В конечном итоге предлагается решить проблему в начале, но если вам приходится иметь дело с ошибочной строкой json, также можно перехватить проблему следующим образом:
if (typeof hex == "object" && hex.hasOwnProperty("_tc_id")) {
alert("no color available; return a default such as fill:'none'");
}
как в этой ветке сообщение о скрипке в вопросе
person
Franco Rondini
schedule
03.07.2013