javascript — фабрика js загружает отдельные объекты на холст из базы данных mysql

У меня есть холст, который живет поверх видео. Когда пользователь приостанавливает видео, он может добавлять объекты fabricjs на холст. Когда объект добавляется на холст, он сохраняется в таблице в базе данных mysql как JSON.

Когда пользователь нажимает кнопку, он запрашивает записи в базе данных mysql и возвращает через ajax объекты для каждой записи в массиве.

Поскольку он проходит через этот массив, я хочу, чтобы fabricjs отображал каждый объект по одному, пока все объекты не будут отображены.

Я пытался с помощью:

canvas.loadFromJSON(rData, canvas.renderAll.bind(canvas), function(o, object) {
fabric.log(o, object);
});

Он загрузит все объекты, но очистит холст перед каждой загрузкой и отобразит только последний объект.

Я попробовал пример здесь:

http://codepen.io/Kienz/pen/otyEz но не могу заставить его работать на меня. Я также пытался http://jsfiddle.net/Kienz/bvmkQ/ но не вижу, что не так.

Итак, я пришел к экспертам! Я ценю все и любую помощь. Спасибо.

Вот моя таблица в MySQL с 2 записями:

CREATE TABLE IF NOT EXISTS `telestrations` (
`id_telestration` int(11) NOT NULL AUTO_INCREMENT,
`object` longtext NOT NULL,
PRIMARY KEY (`id_telestration`),
UNIQUE KEY `id_telestration` (`id_telestration`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=65 ;

--
-- Dumping data for table `telestrations`
--

INSERT INTO `telestrations` (`id_telestration`, `object`) VALUES
(63, '{"objects":[{"type":"i-text","originX":"left","originY":"top","left":161.05,"top":359.29,"width":69.3,"height":20.97,"fill":"#e6977e","stroke":null,"strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeLineJoin":"miter","strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"clipTo":null,"backgroundColor":"","fillRule":"nonzero","globalCompositeOperation":"source-over","text":"AAAAAA","fontSize":16,"fontWeight":"bold","fontFamily":"arial","fontStyle":"","lineHeight":1.16,"textDecoration":"","textAlign":"left","textBackgroundColor":"","styles":{"0":{"1":{},"2":{},"3":{},"4":{},"5":{}}}}],"background":""}'),
(64, '{"objects":[{"type":"i-text","originX":"left","originY":"top","left":463.68,"top":353.84,"width":69.3,"height":20.97,"fill":"#20f20e","stroke":null,"strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeLineJoin":"miter","strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"shadow":null,"visible":true,"clipTo":null,"backgroundColor":"","fillRule":"nonzero","globalCompositeOperation":"source-over","text":"BBBBBB","fontSize":16,"fontWeight":"bold","fontFamily":"arial","fontStyle":"","lineHeight":1.16,"textDecoration":"","textAlign":"left","textBackgroundColor":"","styles":{"0":{"1":{},"2":{},"3":{},"4":{},"5":{}}}}],"background":""}');

Вот мой файл php:

$teles = Telestration::getTeleByVideo();

$objArray = array();
foreach($teles as $tele){
$obj = $tele->getValueEncoded('object');
$objArray[] = $obj;
}
echo json_encode($objArray);

Вот мой JavaScript:

document.getElementById("get_json").onclick = function(ev) {
$.ajax({
url: 'getTelestrations.php',
data: dataString,
type: 'POST',
dataType:"json",
success: function(data){
for (var i = 0; i < data.length; i++) {
rData = data[i].replace(/&quot;/g, '\"');
//Do something
canvas.loadFromJSON(rData, canvas.renderAll.bind(canvas), function(o, object) {
fabric.log(o, object);
});
}
}
});
}

1

Решение

Привет внутри вашего успех использование функции вместо canvas.loadFromJSON , fabric.util.enlivenObjects() вот так:

 //inside the success function, you get the results data from the server and loop inside the items, allright if you have only one object but use      loop for more.
results.data.forEach(function (object) {
var tmpObject = JSON.parse(object.table_data);

fabric.util.enlivenObjects([tmpObject], function (objects) {
var origRenderOnAddRemove = canvas.renderOnAddRemove;
canvas.renderOnAddRemove = false;
console.log(objects);
objects.forEach(function (o) {
canvas.add(o);
console.log(o);
});

canvas.renderOnAddRemove = origRenderOnAddRemove;
canvas.renderAll();
});//end enlivenObjects
});//end data.forEach

Надеюсь это поможет. Удачи

2

Другие решения

Я смог выяснить, как загрузить каждый объект. Оказывается, что json, возвращенный из моего mysql, не был «работоспособным» для fabricjs. Я должен был очистить свой JSON, а затем объекты будут загружаться.

Я только внес изменения в мой JavaScript:

    $.ajax({
url: 'getTelestrations.php',
data: dataString,
type: 'POST',
dataType:"json",
success: function(data){
for (var i = 0; i < data.length; i++) {
//clean results for json
json_result = data[i].replace(/&quot;/g, '\"');             //remove quotes from entire result
json_clean = json_result.replace(/"objects"/, 'objects');       //remove quotes around first object
jsonObj = JSON.parse(JSON.stringify(json_clean));               // parse the entire result
jsonobj2 = eval('(' + jsonObj + ')');
// Add object to canvas
var obj = new fabric[fabric.util.string.camelize(fabric.util.string.capitalize(jsonobj2.objects[0].type))].fromObject(jsonobj2.objects[0]);
canvas.add(obj);
canvas.renderAll();
}
}
});
0

По вопросам рекламы [email protected]