0

QuoteProductService() という JavaScript で「クラス」を作成しました。以下を参照してください。プロトタイプに 2 つの関数を追加しましたが、もう一方の関数 (getFakeQuoteProducts) 内の jquery $.each 内から関数の 1 つ (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);
                }
            }
        }
    });
}
4

3 に答える 3

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);
              }
          }
       }
    });
}
于 2012-11-19T12:07:30.293 に答える
1

var self = this;関数の先頭に追加しgetFakeQuoteProductsます。次に、getQuoteProductFromFlatArray次のように呼び出しますself.getQuoteProductFromFlatArray

于 2012-11-19T12:07:37.913 に答える
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);
                }
            }
        }
    });
}
于 2012-11-19T12:08:55.453 に答える