2013-04-25 1 views
1

Я хочу создать <select> через XML-данные в моем object. Я хочу использовать шаблон Prototype для всего этого, и я должен признать, что я очень новичок в Patterns. Вот что у меня есть:

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(); 

Как я могу ссылаться на «это» как на селектор для каждой функции?

+1

Вы, вероятно, следует двигаться, что «INIT» определение функции в вне конструктора. – Pointy

+0

Также есть много дубликатов для этой проблемы - ключ состоит в том, чтобы сделать копию 'this' в другой переменной, объявленной вне' .each() ', а затем использовать эту переменную вместо' this'. – Pointy

ответ

2

Скопируйте ссылку this на локальную переменную. Таким образом, он будет доступен при закрытии функции обратного вызова.

(Side Примечание: Вы не должны устанавливать прототип внутри конструктора, таким образом, вы бы переназначить его для каждого экземпляра, который вы создаете.)

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

Спасибо за это, он отлично работал. Что касается перемещения прототипа за пределами конструктора, я видел его, прежде чем держать его внутри, а затем обернуть в состояние, чтобы увидеть, была ли эта функция уже создана или нет, поэтому нужно только создать ее один раз и сделать код более эффективный? См. Строки: 2-19 исходного кода этого URL [http://einstein.etsu.edu/~pittares/CSCI3110/examples/6-13.htm](http://einstein.etsu.edu/~pittares /CSCI3110/examples/6-13.htm) – WizzyBoom

+0

@WizzyBoom: Да, это только установило бы прототип один раз, но это делает создание объектов менее эффективным, поскольку вы все равно должны делать эту проверку каждый раз. Я бы предпочел обернуть конструктор и прототип в выражение функции, которое возвращает конструктор, чтобы сохранить его вместе. – Guffa

Смежные вопросы