2012-11-19 4 views
0

Я создал «класс» в javascript, называемый QuoteProductService(), см. Ниже. Я добавил две функции прототипу, и теперь я пытаюсь вызвать одну из функций (getQuoteProductFromArray) изнутри jquery $ .each внутри другой функции (getFakeQuoteProducts). Это не работает. Я попробовал добавить «это», но это также не работает, потому что «это» внутри .each ссылается на текущий элемент цикла.Функция вызова родительского родителя изнутри jquery's .each

Как мне это сделать?

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

Сохранить ссылку на ваш 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

Также часто называют эту переменную 'that' или' self'. –

+2

'self' является зарезервированным словом (afaik) и используется для ссылки на объект' window' браузером. [подробнее на mdn] (https://developer.mozilla.org/en-US/docs/DOM/window.self). Кроме того, это вопрос вкуса, я думаю. Мне лично это не нравится. – Andreas

+0

Отлично! Работает как шарм :) Большое спасибо –

1

Добавить var self = this; в начале функции getFakeQuoteProducts. Затем позвоните getQuoteProductFromFlatArray следующим образом: self.getQuoteProductFromFlatArray.

+0

Отлично! Работает как шарм :) Большое спасибо –

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); 
       } 
      } 
     } 
    }); 
} 
+0

Отлично! Работает как шарм :) Большое спасибо –

Смежные вопросы