обратный вызов jQuery в родительский объект не jQuery - PullRequest
1 голос
/ 08 июля 2010

См. Этот код:

var MyObject = new function() {

  this.tos = new Array();

  this.show = function() {
    this.clearTimeouts();
    $("#divExample").slideDown(null,function() {
      MyObject.tos[MyObject.tos.length] =
        setTimeout(function(){MyObject.doSomething();} , 1800);
    });
    return;
  };

  this.doSomething = function() {
    return;
  };

  this.clearTimeouts = function(){
    for (var i=0; i<this.tos.length; i++)
      clearTimeout(this.tos[i]);
    this.tos = new Array();
    return;
  };

}

MyObject и его методы используются в нескольких местах. Может быть, это плохой способ сделать это, я не знаю. Я не хотел связывать это слишком тесно с jQuery по своим собственным причинам, поэтому оставил это так, чтобы я мог легко изменить слайд на style.display.

Проблема в том, что мне не нравится ссылаться на объект как MyObject в обратном вызове слайда jQuery, но мне нужно добавить ссылку на тайм-аут в мой их массив, чтобы их можно было очистить. Есть ли лучший способ сделать это?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 08 июля 2010

Вы можете попробовать что-то вроде этого:

this.show = function() {
    var obj = this;
    obj.clearTimeouts();
    $("#divExample").slideDown(null,function() {
      obj.tos[obj.tos.length] =
        setTimeout(function(){obj.doSomething();} , 1800);
    });
    return;
  };
1 голос
/ 08 июля 2010
var MyObject = (function() {

  // private variable
  tos = new Array();

  // private method
  function doSomething() {
       // do something
       // ..
  }      

  // return an instance with public methods
  return {
    show: function() {
      this.clearTimeouts();
      $("#divExample").slideDown(null,function() {
        tos[tos.length] =
          setTimeout(function(){ doSomething(); } , 1800);
      });
    },
    clearTimeouts: function() {
      for (var i=0; i<tos.length; i++)
        clearTimeout(tos[i]);
      tos = new Array();
    }
  }
}​;​
...