2015-01-27 1 views
0

У меня возникает следующий вопрос: почему у меня нет доступа к моему массиву в цикле forEach с угловым. Я сделал эту фабрику с массивом и функцией, внутри функции у меня есть этот цикл forEach. Вне цикла forEach я могу получить доступ к моему массиву с ключевым словом this. В цикле forEach он дает неопределенное значение.Почему я не могу получить доступ к массиву на фабрике, пока я нахожусь в цикле forEach с угловым?

.factory("sendOrder", function() { 


    return { 
     paired: [], 

     send: function() { 
      var names = document.getElementsByTagName('input'); 
      var ordered = document.getElementsByClassName('ordered'); 
      var i = 0; 
      console.log(this.paired);//I can access it from here 


      angular.forEach(names, function (amount, key) { 
      console.log(this.paired);//Unable to access 

       i++; 
      return; 
       }) 
     } 
    } 

}) 
+0

[Вы не знаете JS: этот и прототипы объектов] (https://github.com/getify/You-Dont-Know-JS/blob/master/this%20&%20object%20prototypes/README.md # you-dont-know-js-this - object-prototypes) настолько хорош в обучении вас, почему «это» не то, что вы думаете. –

+0

Спасибо за подсказку. Я посмотрю на это. – Michelangelo

ответ

1

Поскольку контекст функциональных изменений - this не то, что он изначально был. Обычное исправление установить исходный контекст переменно (обычно называется self):

.factory("sendOrder", function() { 


    return { 
     paired: [], 

     send: function() { 
       var self = this; 
       var names = document.getElementsByTagName('input'); 
       var ordered = document.getElementsByClassName('ordered'); 
       var i = 0; 
       console.log(this.paired);//I can access it from here 


       angular.forEach(names, function (amount, key) { 
       console.log(self.paired);//should be fine now 

        i++; 
       return; 
        }) 
      } 
     } 
    }) 
+0

Есть ли способ, которым я все еще могу использовать свой массив, или я должен просто обойти его? – Michelangelo

+0

Абсолютно, извините, выложил мой ответ, прежде чем это было сделано. Просто назначьте это переменной. – Shomz

+0

Спасибо за исправление. Также как обычный oop в javascript. – Michelangelo

3

Может быть, это поможет. Angular lets you set the context (это) в forEach. Это один из аргументов. Вам не нужно устанавливать какие-либо другие переменные:

angular.forEach(obj, iterator, [context]);

Вы уже прошли в obj и iterator. Просто передайте что-то для context и это будет this в функции.

+0

Я вижу ... Интересно. Не знал, что я смог это сделать. Спасибо – Michelangelo

+0

Вы можете сделать то же самое в обычном старом массиве JavaScript 'forEach'. –

+1

Да, я знаю, но я хочу изучить его Угловой способ, а иногда Угловой действительно близок к простому javascript. – Michelangelo