2016-08-30 5 views
0

У меня проблема с конваями. У меня есть сцена konva, которую я клонировал во временную Сцена, поэтому я могу отменить изменения, сделанные пользователем, когда пользователь отменяет. То, как я это делаю, заключается в том, что я клонирую существующую Сцену во временную, уничтожаю детей происхождения, и после этого я перемещаю детей временного Сцена обратно в оригинал и уничтожаю временную Сцена. Проблема в том, что когда я пытаюсь получить доступ к дочерним элементам сейчас, например, через findOne ('# id-of-child'), я получаю неопределенное значение, даже если дети существуют.Не удается получить доступ к детям стадии Konva после клонирования

Вот что я сделал до сих пор:

clone: function() 
{ 
    var cloned_stage = this.stage.clone(); 

    Array.each(this.stage.getChildren(), function(layer, lidx) { 
    if (layer.attrs.id) { 
     // setting the id to the ones, the children had before 
     cloned_stage.children[lidx].attrs.id = layer.attrs.id; 
    } 
    }); 
    return cloned_stage; 
}, 

restore: function(tmp_stage) 
{ 
    this.stage.destroyChildren(); 

    Array.each(tmp_stage.getChildren(), function(layer, lidx) { 
    var tmp_layer = layer.clone(); 
    tmp_layer.attrs.id = layer.attrs.id; 
    tmp_layer.moveTo(this.stage); 
    }.bind(this)); 
    tmp_stage.destroy(); 
    this.stage.draw(); 
}, 

Теперь, когда пользователь открывает панель инструментов, чтобы изменить что-то, текущий этап клонируют с помощью функции «клон», и когда пользователь отменяет его изменения, функция «restore» вызывается с клонированной стадией в качестве параметра. Но после этого, когда я пытаюсь сделать что-то вроде следующего, они не работают должным образом.

some_child_of_the_stage.getLayer();  ->  returns null 
var edit_layer = this.stage.findOne('#edit-layer');  -> returns undefined 

Но «some_child_of_the_stage» действительно существует и имеет слой, конечно, и стадия имеет ребенка с идентификатором «редактирования слоя».

Я и мой коллега в конце нашего остроумия.

Я благодарю вас за любую помощь и предложения.

Update: Короткая скрипку, показывая проблему с помощью console.log: fiddle

+0

Можете ли вы сделать jsFiddle, чтобы люди, которые не знакомы с Konva.js можно проверить? – Sergio

ответ

1
  1. лучше не трогать attrs свойство узла и использовать публичные методы получения и установки.

  2. Konva имеет специальную логику для хранения id. Селектор по id #edit-layer может не работать из-за прямого доступа к attrs id.

  3. Вы можете использовать свойство name для этого случая.

https://jsfiddle.net/s36hepvg/12/

+0

Это решает проблему для 'this.stage.findOne ('# edit-layer');' но проблема с функцией 'getLayer()' все еще существует. Кажется, что есть какое-то кэширование или что-то в этом роде, потому что когда я клонирую сцену, элементы на ней все равно выводят один и тот же идентификатор, когда я добавляю событие click, которое выводится через 'console.log()'. – GiftZwergrapper

+0

Можете ли вы добавить демо? – lavrton

+0

Вот скрипка: https://jsfiddle.net/6fa1h9rr/ – GiftZwergrapper

Смежные вопросы