почему я получаю .. это не функция?

0

Я пытаюсь создать угловое обслуживание, но получаю сообщение об ошибке. Это сервис:

var app = angular.module('plunker', []);

// Filter Service that returns records with crdamt positive:
app.factory('FilterService', function() {
  return function(d) {
    var filteredData = [];
    console.log(d);
    d.forEach(function(item) 
    {
      if (item.cramt > 0) {
          filteredData.push(item);
      }
    });
    return filteredData;
  }
});

Однако в моем модульном тесте мы получаем:

  it('should return transactions where credit is positive', function() {
    var jsonData = {
      "transactions": [{
        "date": "1/1/2000",
        "desc": "Purchase",
        "cramt": 50,
        "dbamt": 0
      }, {
        "date": "1/1/2002",
        "desc": "Transaction",
        "cramt": 110,
        "dbamt": 10
      }]
    };

    var filteredRecords = FilterService(jsonData);
    expect(filteredRecords).toEqual({
      "date": "1/1/2000",
      "desc": "Purchase",
      "cramt": 50,
      "dbamt": 0
    });
  });

Почему я получаю сообщение об ошибке:

TypeError: d.forEach is not a function

plunkr: http://plnkr.co/edit/jdg0wEj1zSDTbqojBAoc?p=preview

Теги:
karma-jasmine

5 ответов

2
Лучший ответ

forEach доступен для arrays. Глядя на вашу jsonData вы можете сделать это:

app.factory('FilterService', function() {
  return function(data) {
    var filteredData = [];
    console.log(data.transactions);
    data.transactions.forEach(function(item) 
    {
      if (item.cramt > 0) {
          filteredData.push(item);
      }
    });
    return filteredData;
  }
});

PS: Пожалуйста, прочитайте сообщения об ошибках. В нем четко сказано, что d.forEach не является функцией. Это похоже на попытку определить объект типа:

var person = {
  'name':'Paul'
};

и пытается получить доступ к person.height(). height не является свойством объекта person и вы пытаетесь получить доступ к undefined property as a function.

Больше информации

0

вы можете определить фильтр таким образом.

app.factory('FilterService', function() {

  return function(d) {
    var filteredData = [];
    var boolDataISFound = false;
     console.log(d.transactions)
    d.transactions.forEach(function(item,index) 
    {
      if (item.cramt > 0) {
          filteredData.push(item);
      }
    });
    return filteredData[0];
  }

});

и вот ожидание

it('should return transactions where credit is positive', function() {

    var jsonData = [{
      "transactions": [{
        "date": "1/1/2000",
        "desc": "Purchase",
        "cramt": 50,
        "dbamt": 0
      }, {
        "date": "1/1/2002",
        "desc": "Transaction",
        "cramt": 110,
        "dbamt": 10
      }]
    }];

    var filteredRecords = FilterService(jsonData[0]);
     expect(filteredRecords).toEqual({
        "date": "1/1/2000",
        "desc": "Purchase",
        "cramt": 50,
        "dbamt": 0
      } );


  });

Вот Плункер

0

Посмотрите обновленный plnkr. forEach используется только для массивов, а ваш 'd' возвращает объект.

Ниже приведена ссылка на plnkr:

''http://plnkr.co/edit/o65e0xEsBiW0jpawhGse?p=preview
0

Ваш тест пытается фильтровать весь объект вместо массива транзакций.

var filteredRecords = FilterService(jsonData);
expect(filteredRecords).toEqual({
  "date": "1/1/2000",
  "desc": "Purchase",
  "cramt": 50,
  "dbamt": 0
});

должно быть

var filteredRecords = FilterService(jsonData.transactions);
expect(filteredRecords).toEqual([{
  "date": "1/1/2000",
  "desc": "Purchase",
  "cramt": 50,
  "dbamt": 0
}]);
0

Просто попробуй. Я ожидаю переменную d как массив.

angular.forEach(d, function(item){
    if (item.cramt > 0) {
        filteredData.push(item);
    }
});

Вы не используете правильный синтаксис для функции forEach угловых js. Пожалуйста, обратитесь к этой директиве angle.forEach

  • 0
    JavaScript прекрасно поддерживает arr.forEach .. если бы d был массивом (и работал в браузере, поддерживающем ES5 или ES3), он бы работал как положено. Таким образом, вполне вероятно, что d не является массивом (хотя это может быть и старый браузер).
  • 0
    @ user2864740, Большое спасибо, что поделились своими мыслями .. Я буду иметь в виду :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню