Цвет текста FabricJS является объектом

Я пытаюсь загрузить цвет текста в палитре цветов. Однако, когда я получаю («заполнить») активный объект, загруженный из JSON, он дает мне объект. Вот оскорбительная строка JSON:

"fill":{"ok":true,"format":"hex6","_tc_id":258,"alpha":1}

Как я должен превратить это в цвет, а не в объект?

Добавление jsfiddle:

http://jsfiddle.net/Qb4Xe/5/

Просто нажмите на текст!


person Jack M.    schedule 27.06.2013    source источник


Ответы (1)


Вы правы, проблема в том, что вы восстанавливаете холсты, загружая 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
comment
средство выбора цвета спектра использует tinycolor, как вы можете прочитать в раздел событий документации нам нужно использовать color.toHexString() т. е.: change: function(color) { color.toHexString(); // #ff0000 } - person Franco Rondini; 04.07.2013
comment
Откину глючные записи, toHexString работает и теперь понимаю в чем дело. Спасибо! - person Jack M.; 07.07.2013
comment
это работает для цвета ткани с помощью этого #+color.toHex() - person WorkaroundNewbie; 29.01.2018