jQuery - вызов методов плагина - PullRequest
3 голосов
/ 02 марта 2012

Я пытаюсь создать плагин jQuery, следуя некоторым официальным рекомендациям

(function($){

  var methods = {
    init : function( options ) {
      this.options = options;
    }
  , add_that: function (elem) {
      this.append(elem);
      return (this);
    }
  , add_this: function (elem) {
      return (methods.add_that(elem));
    }
  };

  $.fn.test = function (method) { 
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' + method + ' does not exist on jQuery.test' );
    }    
  };

})(jQuery);

Мне бы хотелось, чтобы метод add_that мог добавлять объекты в соответствующие элементы.
Теперь этот метод вызывается из add_this.

$('#test').test('add_this', $('<div />'));

TypeError: this.append не является функцией

Почему я не могу получить доступ к плагину (this) с add_that?

Ответы [ 2 ]

6 голосов
/ 02 марта 2012

Поскольку область действия изменилась, когда вы вызвали ее с add_this. Обратите внимание, что исходный вызов использовал Function.apply, чтобы охватить вызов this.

if ( methods[method] ) {
  return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
}

Таким образом, вы, вероятно, можете обойти эту проблему, снова применив apply в вашем методе:

add_this: function (elem) {
  return methods.add_that.apply(this,[elem]);
}

Живой пример: http://jsfiddle.net/XaUHV/

2 голосов
/ 02 марта 2012

В том контексте, в котором вы его используете, «this» относится к методам .add_that

Так как метод.

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