为什么我得到..不是函数?

时间:2015-07-07 04:55:40

标签: angularjs karma-jasmine

我正在尝试创建角度服务但收到错误。这是服务:

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

5 个答案:

答案 0 :(得分:3)

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

P.S:请阅读错误消息。它清楚地说d.forEach不是函数。这就像尝试定义一个对象:

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

并尝试访问person.height()height不是person对象的属性,而您正尝试访问 undefined property as a function

More info

答案 1 :(得分:0)

试试吧。我期待变量d作为数组。

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

您没有使用角度js的forEach函数的正确语法。请参阅此angular.forEach指令

答案 2 :(得分: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
}]);

答案 3 :(得分:0)

请查看更新的plnkr。 forEach仅用于数组,而'd'返回一个对象。

以下是plnkr的链接:

func signup(w http.ResponseWriter, r *http.Request) {
    var S Signup
    S.name = r.FormValue("name")
    S.email = r.FormValue("email")

    fmt.Printf("%+v\n", S)

    fmt.Fprintf(w, "Form received, you used name: %s", S.name)
}

答案 4 :(得分: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
      } );


  });

以下是Plunker