1

<select>.xml 内に via XML データを構築したいと考えていobjectます。私はこれらすべてに Prototype パターンを使用したいと思っています。ここに私が持っているものがあります:

HTML サンプル:

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

XML サンプル:

<names>
  <nameDetails name="Name 01" phone="555-867-5309" email="none@nothing.no" />
  <nameDetails name="Name 02" phone="555-867-5309" email="none@nothing.no" />
  <nameDetails name="Name 03" phone="555-867-5309" email="none@nothing.no" />
  <nameDetails name="Name 04" phone="555-867-5309" email="none@nothing.no" />
  <nameDetails name="Name 05" phone="555-867-5309" email="none@nothing.no" />
</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」を参照するにはどうすればよいですか?

4

1 に答える 1

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
};
于 2013-04-25T20:03:52.127 に答える