2015-06-22 25 views
1

我正在使用raphaeljs和socketIO進行實時數據演示。我有我的畫布上的圓圈代表節點,他們被存儲在nodeStatus對象nodeStatus[id].obj其中「ID」可以是「101」,「102」等,我試圖實現一個函數來隨機刪除先前繪製的圓圈(節點)從客戶端瀏覽器的畫布。從畫布中刪除隨機的raphael元素

用於發送節點ID & obj的服務器端腳本是:socket.emit("randomNode",randomNode,nodes[randomNode]);。 randomNode包含我想要移除的圓的ID。節點[randomNode]是存儲該節點信息的對象。

下面是我的客戶端html中的相關部分。 (節點ID是我想從帆布/紙上除去(圓圈(節點)的ID)和obj是相應的對象)

socket.on("randomNode",function (nodeID, obj){ 
    nodes[nodeID] = obj; 
    console.log(nodeID,obj); 
    updateNodeStatus(nodeID); 
    console.log(nodeStatus[nodeID]); 
    nodeStatus[nodeID].obj.remove(); 
    nodeStatus[nodeID].idText.remove(); 
}); 

nodeStatus[nodeID].obj.remove();生產「類型錯誤:nodeStatus [ID]的obj是未定義「錯誤。

console.log(nodeID);打印預期值如「101」,「102」等,並且nodeStatus[102].obj.remove();從畫布上移除「具有id = 101的raphael對象」。但nodeStatus[nodeID].obj.remove();不能正常工作。有人能指出我做錯了什麼嗎?

+0

任何機會,你可以得到一個jsfiddle的測試例子,或至少更多的nodeStatus周圍的代碼,當它的內置。特別是做一個console.log(nodeStatus [nodeID]);你在那裏有你的代碼,但實際上並不是它輸出的內容。 – Ian

+0

無法在jsfiddle上獲取我的代碼,因爲它具有服務器端「.js」,服務器端「config.js」和客戶端端「.html」用於socket.io。不過,我得到了它的工作。謝謝。 –

回答

0
socket.on("randomNode",function (nodeID, obj){ 
    nodeStatus[nodeID].obj.remove(); 
    nodeStatus[nodeID].idText.remove();  
    nodes[nodeID] = obj; 
    console.log(nodeID,obj); 
    updateNodeStatus(nodeID); 
    console.log(nodeStatus[nodeID]); 
}); 

事實證明,raphael對象(保存在nodeStatus obj中)必須先被移除。 updateNodeStatus(nodeID)僅更新特定節點(id = nodeID的節點)上的信息,因此nodeStatus[nodeID].objnodeStatus[nodeID].idText未定義。