我使用此脚本进行页面分页,如本教程 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);
};
});
这是什么意思?
- 每个过滤器都必须接受
输入
并返回输出
。 - 每个过滤器都必须根据条件构建。这意味着,在示例中:给定一个特定的开始,给我一个接受输入并生成输出切片的函数(开始,10)。
- 这很像装饰器模式。
- 不相信我?阅读official doc了解过滤器如何成为高阶函数(返回函数的函数 - 该函数成为条件工厂,并且生成的函数仅用于定义函数的目的)。
你的错误是什么?
- 在包装函数中(比方说),您必须仅提供用于定义实际过滤器的函数的参数。您将将此过滤器用作
{{ myArray|offset:3 }}
,并且仅接收一个参数:(start)
,在本例中为 3。< - 封装的函数将完全采用一个参数(名称并不重要)。
为了进一步说明这一点:(编辑...)
让我们创建一个新的过滤器,其中一个参数的上限比您的过滤器多:
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 }}
你说的是:
- 采用参数 (5, 5)。
- 创建一个函数,该函数接受输入并在 (5, 10) 上对其进行切片,然后返回它。
- 将返回的函数应用于
myArray
。
关于javascript - 类型错误 : Cannot read property 'slice' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25023846/