2011-06-09 57 views
0

我正在真正學習使用JavaScript對象的細微差別,並陷入困境。測試JavaScript對象的意外結果

我有一組「名稱空間」對象來分割DOM和模型以進行操作。下面是代碼:

function Sandbox2(){ 
this.page = { 
     FirstName: document.getElementById("FirstName") 
    , LastName: document.getElementById("LastName") 
    , Email: document.getElementById("Email") 
}; 

this.model = { 
     FirstName: "James" 
    , LastName: "Eggers" 
    , Email: "[email protected]" 
}; 

this.behavior = {}; 

this.bindPageToModel = function(){ 
    for(var property in this.page){ 
     if (property){ 
      property.value = this.model[property]; 
     } 
    } 
}; 

    this.bindModelToPage = function(){ 
    for(var property in this.model){ 
     if (property){ 
      this.model[property].value = this.page[property]; 
     } 
    } 
}; 
}; 

使用JsTestDriver,我做了一些測試,以玩弄和嘗試的頁面和模型對象的一些事情。具體測試如下:

"test ModelBinding should be allowed." : function(){ 
     var sandbox2 = new Sandbox2(); 
     var page = sandbox2.page; 
     page.FirstName = "Test"; 
     page.LastName = "Account"; 
     sandbox2.bindModelToProperty(); 

     assertEquals("Ensure the new values took.", page.FirstName, sandbox2.page.FirstName); 
     assertEquals("New Page values should be in the model.", "Test", sandbox2.model.FirstName); 
    } 

在上面的測試中,第一個assertEquals通過;然而,第二個測試將sandbox2.model.FirstName解析爲「James」(初始值)。

任何人都有關於如何更改代碼(原始或測試)的任何建議,以允許我將page對象的值映射到model對象?

+1

我會告訴你,在實踐中,'姓:的document.getElementById(「名字」)'是不是一個好主意。你不想在一個對象中存儲對DOM節點的引用 - 這可以爲一個對象創建一個循環引用,對另一個來說,如果DOM樹被重建(比如說因爲頁面內容被修改爲一個字符串[不是很好的做法]) ,您的參考將不再有效。你最好在使用它之前抓住一個DOM節點,而不是在對象的屬性中保留對它的引用。 – 2011-06-09 17:57:55

+0

@Chris我完全同意。這段代碼實際上更像是一個我在玩的沙盒,同時也學習了JsTestDriver。在實踐中,我會讓頁面對象每次都重新獲取特定的節點。 – JamesEggers 2011-06-09 18:10:03

回答

2

好像問題就在這裏:

for(var property in this.page){ 
    if (property){ 
     property.value = this.model[property]; 
    } 
} 

property變量實際上是對象(名字,姓氏和電子郵件)的鍵值。您正在對這些字符串對象設置value屬性而沒有任何結果。

我覺得你的意思做這樣的事情:

this.page[property].value = this.model[property]; 
+0

謝謝盧卡!實際上有兩個問題。第一,在我最初的代碼示例中(代碼已更新),我正在從模型到頁面而不是頁面到模型。第二個解決方案是你指出在這種情況下'屬性'是字符串鍵而不是屬性本身。我不得不刪除'.value'以使其起作用。再次感謝。 – JamesEggers 2011-06-09 18:18:27