【问题标题】:why do I get ..is not a function?为什么我得到..不是一个函数?
【发布时间】:2015-07-07 14:09:48
【问题描述】:

我正在尝试创建 Angular 服务,但出现错误。这是服务:

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

【问题讨论】:

  • 仅供参考,根据该代码和测试数据,您的测试将失败。
  • 要么d 不是数组(在这种情况下它不支持Array.prototype.forEach),要么没有使用适当的现代/垫片 JS 版本(在这种情况下数组不支持 Array.prototype .forEach)。在所有情况下,错误消息都是 100% 正确的。

标签: angularjs karma-jasmine


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    您没有为 Angular js 的 forEach 函数使用正确的语法。请参考这个angular.forEach指令

    【讨论】:

    • JavaScript 支持 arr.forEach 就好了.. 如果 d 一个数组(并在支持 ES5 或填充 ES3 的浏览器中运行),它将按预期工作。因此,d 很可能不是数组..(尽管它也可能是旧浏览器)。
    • @user2864740,非常感谢您分享您的想法。我会记住的:-)
    【解决方案3】:

    您的测试试图过滤整个对象而不是交易数组。

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

    【讨论】:

      【解决方案4】:

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

      以下是 plnkr 的链接:

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

      【讨论】:

        【解决方案5】:

        您可以通过这种方式定义过滤器。

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-05
          • 2022-01-02
          • 2021-12-13
          • 2010-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多