2016-08-30 36 views
0

我有一個konvajs問題。我有一個克隆階段,我克隆到一個臨時階段,所以我可以恢復用戶取消時所做的更改。 我這樣做的方式是,我將現有舞臺克隆爲臨時舞臺,摧毀起源的孩子,之後我將臨時舞臺的孩子移回到原始舞臺並摧毀臨時舞臺。問題是,當我嘗試通過findOne('#id-of-child')來訪問孩子時,即使孩子存在,我也沒有定義。克隆後無法訪問Konva Stage的兒童

這是我到目前爲止已經完成:

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(); 
}, 

現在,當用戶打開工具箱改變一些東西,目前階段是克隆的「克隆」功能,當用戶取消了他的變化, 「復原」功能以克隆階段爲參數進行調用。 但之後,當我嘗試做下面的事情時,他們不按預期工作。

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

但「some_child_of_the_stage」確實存在,當然有一層和舞臺有id爲「編輯層」一個孩子。

我和我的同事在我們的智慧結束。

我感謝您的任何幫助和建議,謝謝。

更新: 短撥弄通過的console.log顯示問題: fiddle

+0

你可以做一個這樣的jsfiddle人們不熟悉Konva.js可以測試? – Sergio

回答

1
  1. 最好不要去碰一個節點的attrs性能和使用公共getter和setter。

  2. Konva具有用於存儲id屬性特殊的邏輯。由ID爲#edit-layer的選擇器可能無法正常工作,因爲可以直接訪問attrs ID。

  3. 您可以使用該屬性的名稱屬性。

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

+0

這解決了'this.stage.findOne('#edit-layer');'但getLayer()'函數的問題仍然存在。它看起來好像有一些緩存或某些東西,因爲當我克隆階段時,當我添加通過'console.log()'輸出的click事件時,它上面的元素仍然輸出相同的id。 – GiftZwergrapper

+0

你可以添加演示嗎? – lavrton

+0

這裏是一個小提琴:https://jsfiddle.net/6fa1h9rr/ – GiftZwergrapper