2010-11-18 2 views
2

У меня проблемы с просмотром в javascript. Я использую плагин jquery, чтобы написать класс, который является оболочкой для наших выпадающих элементов управления.Проблема с областью Javascript

проблема в функции loadJsonList, вызов this.addOption(s.itemValue, s.itemText); не работает, поскольку метод не существует. Я знаю, что у JS есть странное определение, но я не знаю, как я могу запустить эту функцию в этой области?

jQuery.Class.extend("DDL", 
{ 
    id: '', 
    isTelerik: false 
}, 
{ 
    init: function (newid) { 
     this.Class.id = newid; 

    }, 
    getValue: function() { 
     return $('#' + this.Class.id).val(); 
    }, 
    getText: function() { 
     return $('#' + this.Class.id + ' :selected').text(); 
    }, 
    setValue: function (newValue) { 
     try { 
      $('#' + this.Class.id).val(newValue); 
     } catch (err) { 
      alert(err); 
     } 
    }, 
    setText: function (newText) { 
     try { 
      $('#' + this.Class.id + ' :selected').text(newText); 
     } catch (err) { 
      alert(err); 
     } 
    }, 
    loadJsonList: function (list, param1, param2, param3) { 
     this.clearItems(); 

     //init the service 
     var j = new JsonRPC(); 

     // get the cut down data table 
     var dt = j.getDropDownData(list, param1, param2, param3); 

     // parse the datatable and load it into the telerik combo box 
     jQuery.each(dt, function (i, s) { 
      this.addOption(s.itemValue, s.itemText); 
     }); 
    }, 
    addOption: function (value, text) { 
     $('#' + this.Class.id).append('<option value="' + value + '">' + text + '</option>'); 
    }, 
    removeOption: function (value) { 
     $('#' + this.Class.id + ' option[value="' + value + '"]').remove(); 
    }, 
    clearItems: function() { 
     $('#' + this.Class.id + ' option').remove(); 
    } 
}); 
+1

Чтобы быть немного педантичный, когда речь идет о 'this' вы не говорите о обзорного но переплета. – slebetman

ответ

3

Простой. JavaScript использует уровень функции область видимости, так что вы сохраните ссылку на переменную this под каким-то другим именем:

loadJsonList: function (list, param1, param2, param3) { 
     // save a reference for use in the each function later 
     var self = this; 
     this.clearItems(); 

     //init the service 
     var j = new JsonRPC(); 

     // get the cut down data table 
     var dt = j.getDropDownData(list, param1, param2, param3); 

     // parse the datatable and load it into the telerik combo box 
     jQuery.each(dt, function (i, s) { 
      // use self instead of this! 
      self.addOption(s.itemValue, s.itemText); 
     }); 
    }, 
2

this в рамках этой функции не равен одному и тому же this вашего объект, вам нужно присвоить переменный псевдоним к нему в окружающей области видимости для того, чтобы доступ к нему внутри внутренней функции:

var self = this;  
jQuery.each(dt, function (i, s) { 
    self.addOption(s.itemValue, s.itemText); 
}); 
0

Что вы ищете способ JQuery в прокси (http://api.jquery.com/jQuery.proxy):

// Description: Takes a function and returns a new one that will always have a particular context. 
jQuery.proxy(function, context) 

Так что в вашем примере выше вы будете использовать его следующим образом:

loadJsonList: function (list, param1, param2, param3) { 

    // ... 

    jQuery.each(dt, jQuery.proxy(function (i, s) { 
     this.addOption(s.itemValue, s.itemText); 
    }, this)); 
}, 
Смежные вопросы