从jquery的.each中调用父级父级中的函数

时间:2012-11-19 12:04:00

标签: javascript jquery scope each

我在javascript中创建了一个名为QuoteProductService()的'class',见下文。 我已经为原型添加了两个函数,现在,我试图从另一个函数(getFakeQuoteProducts)中的jquery $ .each中调用其中一个函数(getQuoteProductFromArray)。这不起作用。我尝试添加'this。',但这也行不通,因为.each中的'this'指的是循环中的当前元素。

我该怎么做?

function QuoteProductService() {

}

QuoteProductService.prototype.getQuoteProductFromArray =  function(quoteproductarray, quoteproductid){
     var founditem=null;
     // do stuff
    return founditem;
}

QuoteProductService.prototype.getFakeQuoteProducts = function(){
    // do something to fill the mappedQuoteProducts array
    $.each(mappedQuoteProducts, function (index, quoteproduct) {
        if (quoteproduct!=-null) {
            if (quoteproduct.parentid != "") {
                // this is where it goes wrong :
                var parent = getQuoteProductFromArray(mappedQuoteProducts, quoteproduct.parentid);
                if (parent != null) {
                    parent.attachChild(quoteproduct);
                }
            }
        }
    });
}

3 个答案:

答案 0 :(得分:4)

在致电QuoteProductService

之前,请保存对each个实例的引用
QuoteProductService.prototype.getFakeQuoteProducts = function(){
  var _this = this;
  // do something to fill the mappedQuoteProducts array
  $.each(mappedQuoteProducts, function (index, quoteproduct) {
      if (quoteproduct!=-null) {
          if (quoteproduct.parentid != "") {
              // this is where it goes wrong :
              var parent = _this.getQuoteProductFromFlatArray(mappedQuoteProducts, quoteproduct.parentid);
              if (parent != null) {
                  parent.attachChild(quoteproduct);
              }
          }
       }
    });
}

答案 1 :(得分:1)

var self = this;添加到getFakeQuoteProducts功能的开头。然后拨打getQuoteProductFromFlatArray,如下所示:self.getQuoteProductFromFlatArray

答案 2 :(得分:1)

首先,您提供了错误的方法名称 - getQuoteProductFromFlatArray而不是getQuoteProductFromArray。其次在JS中,您必须为实例方法提供范围。 实现此目的的最简单方法是将this引用存储到其他一些私有变量中。请参阅下面的示例。

function QuoteProductService() {

}

QuoteProductService.prototype.getQuoteProductFromArray =  function(quoteproductarray, quoteproductid){
     var founditem=null;
     // do stuff
    return founditem;
}

QuoteProductService.prototype.getFakeQuoteProducts = function(){
    var me = this; // store this into me

    // do something to fill the mappedQuoteProducts array
    $.each(mappedQuoteProducts, function (index, quoteproduct) {
        // this === me will return false
        if (quoteproduct!=-null) {
            if (quoteproduct.parentid != "") {
                // this is where it goes wrong :
                var parent = me.getQuoteProductFromArray(mappedQuoteProducts, quoteproduct.parentid);
                if (parent != null) {
                    parent.attachChild(quoteproduct);
                }
            }
        }
    });
}