2013-04-25 42 views
1

我想通過我的object中的XML數據構建<select>。我想使用原型模式,我不得不承認我對模式很陌生。下面是我有:

HTML樣本:

<select id="ddFullName" name="Full_Name" ></select> 

XML示例:

<names> 
    <nameDetails name="Name 01" phone="555-867-5309" email="[email protected]" /> 
    <nameDetails name="Name 02" phone="555-867-5309" email="[email protected]" /> 
    <nameDetails name="Name 03" phone="555-867-5309" email="[email protected]" /> 
    <nameDetails name="Name 04" phone="555-867-5309" email="[email protected]" /> 
    <nameDetails name="Name 05" phone="555-867-5309" email="[email protected]" /> 
</names> 

的JavaScript樣本:

function buildNameDropdown(data, elem) { 
    this.data = data; 
    this.name = $(data).find('nameDetails'); 
    this.elem = elem; 

    buildNameDropdown.prototype.init = function() 
    { 
     //Working as desired 
     $(this.elem).append($('<option value=""> ----- Select a Name ----- </option>')); 
     //Not working 
     $(this.name).each(function() 
     { 
      //$(this) = the object, not 'this.name' 
      $(this.elem).append($('<option value="' + $(this).attr('name') + '">' + $(this).attr('name') + '</option>')); 

     }); 
     $(this.elem).combobox(); // from jQuery UI combobox extension 
    }; 
}; 


var myNameDropdown = new buildNameDropdown(data, "#ddFullName"); 
myNameDropdown.init(); 

我想如何引用'this'作爲每個函數的選擇器?

+1

你或許應該是「初始化」函數定義移到在構造函數之外。 – Pointy 2013-04-25 19:48:31

+0

此外還有很多重複的問題 - 關鍵是在'.each()'之外聲明的另一個變量中複製'this',然後使用該變量而不是'this'。 – Pointy 2013-04-25 19:50:23

回答

2

this引用複製到局部變量。這樣它將在關閉回調函數中可用。

(旁註:你不應該設置原型在構造函數中,這樣,你會重新分配它爲您創建的每個實例。)

function buildNameDropdown(data, elem) { 
    this.data = data; 
    this.name = $(data).find('nameDetails'); 
    this.elem = elem; 
}; 

buildNameDropdown.prototype.init = function() { 
    $(this.elem).append($('<option value=""> ----- Select a Name ----- </option>')); 
    var t = this;  
    $(this.name).each(function() { 
    $(t.elem).append($('<option value="' + $(this).attr('name') + '">' + $(this).attr('name') + '</option>')); 
    }); 
    $(this.elem).combobox(); // from jQuery UI combobox extention 
}; 
+0

謝謝你,這工作很完美。至於把原型移到構造函數的外部,我在將它保留在in之前就已經看到了,然後將其包裝在一個條件中,以查看函數是否已經創建,因此只需創建一次並使代碼更加完整有效?請參閱此URL的源代碼的行2-19 [http://einstein.etsu.edu/~pittares/CSCI3110/examples/6-13.htm](http://einstein.etsu.edu/~pittares /CSCI3110/examples/6-13.htm) – WizzyBoom 2013-04-25 23:24:31

+0

@WizzyBoom:是的,這隻會設置一次原型,但它會使得對象的創建效率降低,因爲您每次都必須進行檢查。我寧願將構造函數和原型包裝在一個返回構造函數的函數表達式中,以將它保持在一起。 – Guffa 2013-04-26 06:54:23