Javascript, передавая функцию в литерале объекта и это вызывается? - PullRequest
1 голос
/ 20 октября 2011

всегда в процессе изучения Javascript и модификации классной библиотеки автозаполнения , я сейчас перед этим:

Мне нужно проверить, является ли что-то, переданное в литерале объекта, переменной / полем (которое следует рассматривать как простое значение) или что-то, что можно вызвать.

(так как МОЕ автозаполнение зависит от многих полей ввода, мне нужно "оценить" правильные вещи, непосредственно перед Ajax.Request), чтобы это объявление (см. "Дополнительные" части ...)

   myAutoComplete = new Autocomplete('query', {
        serviceUrl:'autoComplete.rails',
    minChars:3,
    maxHeight:400,
    width:300,
    deferRequestBy:100,
    // callback function:
    onSelect: function(value, data){
                alert('You selected: ' + value + ', ' + data);
                       }
            // the lines below are the extra part that i add to the library
            //     an optional parameter, that will handle others arguments to pass
            //     if needed, these must be value-ed just before the Ajax Request... 
    , extraParametersForAjaxRequest : { 
                  myExtraID : function() { return document.getElementById('myExtraID').value; } 
    }

см. "1 // здесь я потерян ..." ниже, и вместо 1 => я хотел бы проверить, может ли extraParametersForAjaxRequest [x] вызываться или нет, и вызвать его, если это так, сохраняя только его значение, если нет. Таким образом, я получаю правильное значение от других моих входных данных ... сохраняя при этом действительно общий подход и чистую модификацию этой библиотеки ...

{
  var ajaxOptions = {
    parameters: { query: this.currentValue , },
    onComplete: this.processResponse.bind(this),
    method: 'get'
  };
  if (this.options.hasOwnProperty('extraParametersForAjaxRequest'))
  {
      for (var x in this.options.extraParametersForAjaxRequest)
      {
          ajaxOptions.parameters[x] = 1 // here i'm lost...
      }
  }


  new Ajax.Request(this.serviceUrl, ajaxOptions );

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Вы можете сделать typeof, чтобы увидеть, является ли параметр функцией, и вызвать его, если он есть.

var value;
for (var x in this.options.extraParametersForAjaxRequest)
{
    value = this.options.extraParametersForAjaxRequest[x];

    if (typeof(value) == 'function') {
        ajaxOptions.parameters[x] = value();
    }
    else {
        ajaxOptions.parameters[x] = value;  
    }
}
2 голосов
/ 20 октября 2011
   if (typeof this.options.extraParametersForAjaxRequest[x]==='function') {

   }

Вы также должны сделать следующее:

   if (this.options.extraParametersForAjaxRequest.hasOwnProperty(x) {
       if (typeof this.options.extraParametersForAjaxRequest[x]==='function') {

       }
   }

при переборе свойств объектов, в противном случае вы также можете в конечном итоге взглянуть на элементы-прототипы.это более читабельно с псевдонимом для вещи, с которой вы работаете.Таким образом, в конечном итоге будет:

  var opts = this.options.extraParametersForAjaxRequest;
  // don't need to check for existence of property explicitly with hasOwnProperty
  // just try to access it, and check to see if the result is
  // truthy. if extraParametersForAjaxRequest isn't there, no error will
  //  result and "opts" will just be undefined
  if (opts)
  {
      for (var x in opts) {
          if (opts.hasOwnProperty(x) && typeof opts[x]==='function') {

          }
       }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...