2015-10-18 68 views
0

我在PaperScript中創建了兩類對象:Node s和Line s。每行都有一個this.nodes屬性,該屬性是引用兩個節點對象的數組,每行一個。節點具有this.dragging屬性,當創建節點對象時,該屬性被初始化爲false,但在onMouseDown事件上被設置爲true,並且被設置回falseonMouseUp。這樣我就可以跟蹤節點是否意圖在某個時間點移動。嘗試從另一個對象訪問對象屬性始終返回屬性的初始值

現在我希望能夠從Line對象中檢查其關聯節點是否在任何時間點被拖動。爲此我有一個if語句來檢查是否(this.nodes[0].dragging == true || this.nodes[1].dragging == true)。如果這返回true,則可能會發生進一步的操作。

問題是無論我是否拖動節點,兩個this.nodes[i].dragging都始終返回false。爲什麼會發生?特別是當我從Node對象中檢查this.dragging的值時,它確實會在拖動時返回正確的true值,否則返回false。

編輯包括一些代碼:

以下是我的代碼的精簡版。重要的是this.dragging變量。

function Node(pos) { 

///// Stuff 

    this.dragging = false; 
    this.node.onMouseDown = function(event) { 
    this.dragging = true; 
    // Do other stuff 
    } 
    this.node.onMouseDrag = function(event) { 
    if (this.dragging == true) { 
     // Do stuff 
    } 
    } 
    this.node.onMouseUp = function(event) { 
    // Do stuff 
    this.dragging = false; 
    } 
} 

以下是(的一部分)的構造函數Line對象:

function Line(p1, p2) { 
    this.nodes = [p1, p2]; 

    ///// Stuff 

    this.update = function() { 
    if (this.nodes[0].dragging === true || this.nodes[1].dragging === true) { 
     // True 
    } else { 
     // False 
    } 
    } 
} 

2日編輯評論者要求我如何實例化這些對象:

我實例化它們如下:

var nodeNum = 7; 
var lineConnections = [{ 
    from: 0,to: 1} 
    ,{from: 0,to: 2} 
    ,{from: 0,to: 3} 
    ,{from: 0,to: 4} 
    ,{from: 1,to: 2} 
    ,{from: 1,to: 5} 
    ,{from: 2,to: 3} 
    ,{from: 2,to: 4} 
    ,{from: 3,to: 5} 
    ,{from: 4,to: 5} 
    ,{from: 2,to: 5} 
] 

function init() { 
    for (var i = 0; i < nodeNum; i++) { 
    Nodes[i] = new Node(); 
    } 

    for (var i = 0; i < lineConnections.length; i++) { 
    Lines[i] = new Line(Nodes[lineConnections[i].from], Nodes[lineConnections[i].to]); 
    } 
} 

init(); 

現場演示可在http://aronadler.com/experiment/

+0

首先,體面的探索,但我們不能開始猜測沒有一些代碼。請發佈您的類構造函數等。如果它更復雜,JFiddle會很好的工作。 – Wobbles

+0

最初的想法,我可能會使用===運算符進行測試,因爲== true有時可能表現錯誤,具體取決於屬性的解釋方式。 – Wobbles

+0

我無法弄清楚如何讓我的PaperScript文件的內容在JSFiddle中工作,所以如果我將它鏈接到託管的域名就足夠了。該項目目前在http://aronadler.com/experiment/ – Aron

回答

1

我認爲問題是this,如下代碼中的this.dragging指的是全局對象(窗口),而不是你創建的對象。

this.node.onMouseDown = function(event) { this.dragging = true; // Do other stuff } this.node.onMouseDrag = function(event) { if (this.dragging == true) { // Do stuff } } this.node.onMouseUp = function(event) { // Do stuff this.dragging = false; }

您可以通過,如果全局變量拖動已創建看到檢查。我不能真正修改你的代碼,除非它在小提琴或其他易於使用的位置,但是你應該可以通過將每個鼠標處理函數綁定到此處來修復它,如下所示: this.node.onMouseUp = function(event) { // Do stuff this.dragging = false; }.bind(this) 或創建與本地參考封閉此不會改變,如在:

self = this;

然後從相對於this功能內指self

+0

實際上,這在紙張Tool事件的上下文中是指工具對象,而不是窗口。 – bmacnaughton

相關問題