【问题标题】:TypeError: Cannot read property 'slice' of undefinedTypeError:无法读取未定义的属性“切片”
【发布时间】:2017-10-12 06:53:46
【问题描述】:

我使用这个脚本进行页面分页,就像本教程中一样http://fdietz.github.io/recipes-with-angular-js/common-user-interface-patterns/paginating-through-client-side-data.html

app.filter('offset', function() {
    return function(input, start) {
        start = parseInt(start, 10);
        return input.slice(start);
    };
});

一切都很好,只是我遇到了一个错误

TypeError: Cannot read property 'slice' of undefined
at k.<anonymous> (http://www.foo.com/43267ztX/default/:18:17)
at e (http://www.foo.com/43267ztX/default/js/angular.min.js:171:180)
at db.| (http://www.foo.com/43267ztX/default/js/angular.min.js:160:65)
at F.constant (http://www.foo.com/43267ztX/default/js/angular.min.js:170:82)
at db.| (http://www.foo.com/43267ztX/default/js/angular.min.js:160:70)
at F.constant (http://www.foo.com/43267ztX/default/js/angular.min.js:170:82)
at Object.$watch.p (http://www.foo.com/43267ztX/default/js/angular.min.js:107:159)
at k.$digest (http://www.foo.com/43267ztX/default/js/angular.min.js:109:78)
at k.$apply (http://www.foo.com/43267ztX/default/js/angular.min.js:112:173)
at h (http://www.foo.com/43267ztX/default/js/angular.min.js:72:300) </pre>

【问题讨论】:

  • 那么如果slice 不是undefined 的属性,那么您的哪些变量必须是未定义的?您的答案在错误消息中。
  • 显示其他代码...我也遇到了类似的错误,但过滤器不是原因..尝试查看您拥有的其他代码..但显示与您过滤器相关的其他代码会有所帮助..
  • 其实这个错误很全面。我很确定input 是未定义的。
  • 我没有发现错误。我在帖子中提到的网站上使用了 jsfiddle。如果没有问题可以关闭吗?

标签: javascript angularjs


【解决方案1】:

试试:

app.filter('offset', function(start) {
    return function(input) {
        start = parseInt(start, 10);
        return input.slice(start);
    };
});

这是什么意思?

  1. 每个过滤器都必须采用 input 并返回 output
  2. 必须根据标准构建每个过滤器。这意味着,在示例中:给定一个开始,给我一个函数,它接受一个输入并产生一个输出切片 (start, 10)
  3. 这很像装饰器模式。
  4. 不相信我?阅读official doc,了解过滤器如何成为高阶函数(返回函数的函数 - 此函数成为标准工厂,生成的函数仅用于已定义函数的目的)。

你的错误是什么?

  1. 在包装函数(比方说)中,您必须只提供用于定义将成为实际过滤器的函数的参数。您将使用此过滤器作为{{ myArray|offset:3 }},并且只接收一个参数:(start),在本例中为 3。
  2. 包装后的函数将采用恰好一个参数(名称无关紧要)。

为了进一步说明这一点:(正在编辑...)

让我们创建一个新的过滤器,一个参数的上限比你的要多:

app.filter('limit', function(start, count) {
    start = parseInt(start);
    count = parseInt(count);
    return function(input) {
        return input.slice(start, start + count);
    }
});

每个过滤器都是一种工厂(实际上:它是一个工厂)。这一个采用两个参数并产生实际的过滤器。实际的过滤器是一个接受参数并返回过滤值的函数。内部标准由我传递给包装函数的参数定义。

所以当你像这样使用它时:

{{ myArray | limit:5:5 }}

你这样说:

  1. 接受参数 (5, 5)。
  2. 创建一个函数,该函数接受输入并将其切片 (5, 10),然后返回。
  3. 将返回的函数应用于myArray

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2020-02-09
    • 2015-08-31
    • 2019-12-26
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多