javascript - 类型错误 : Cannot read property 'slice' of undefined

标签 javascript angularjs

我使用此脚本进行页面分页,如本教程 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>

最佳答案

尝试:

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

这是什么意思?

  1. 每个过滤器都必须接受输入并返回输出
  2. 每个过滤器都必须根据条件构建。这意味着,在示例中:给定一个特定的开始,给我一个接受输入并生成输出切片的函数(开始,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

关于javascript - 类型错误 : Cannot read property 'slice' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25023846/

相关文章:

javascript 匿名事件与命名事件

javascript - 如何创建具有 getter 和 setter 方法的 Angular 工厂而不遇到竞争条件

javascript - 通过 Web 凭证 API 通过 JavaScript 对象存储凭证?

angularjs - 如何在 AngularJS 中跟踪范围变量的变化

javascript - 为什么我的代码变成 "10 $digest error"?

javascript - 我只想创建一个音频播放器实例

javascript - 将 URL 信息从父 iframe 转发到子 iframe

javascript - 第一个文本内容的 jQuery 选择器

javascript - 来自不同域的 Greasemonkey AJAX 请求?

javascript - 类型错误 : Cannot read property 'field1' of undefined?