Я пытаюсь создать угловое обслуживание, но получаю сообщение об ошибке. Это сервис:
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
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
.
вы можете определить фильтр таким образом.
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
} );
});
Вот Плункер
Посмотрите обновленный plnkr. forEach используется только для массивов, а ваш 'd' возвращает объект.
Ниже приведена ссылка на plnkr:
''http://plnkr.co/edit/o65e0xEsBiW0jpawhGse?p=preview
Ваш тест пытается фильтровать весь объект вместо массива транзакций.
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
}]);
Просто попробуй. Я ожидаю переменную d
как массив.
angular.forEach(d, function(item){
if (item.cramt > 0) {
filteredData.push(item);
}
});
Вы не используете правильный синтаксис для функции forEach
угловых js. Пожалуйста, обратитесь к этой директиве angle.forEach
arr.forEach
.. если быd
был массивом (и работал в браузере, поддерживающем ES5 или ES3), он бы работал как положено. Таким образом, вполне вероятно, чтоd
не является массивом (хотя это может быть и старый браузер).