在Knockout.js中使用Lodash排序列表时遇异常求助
解决Knockout.js observableArray排序时的"handlerfunction apply is not a function"错误
看起来你在使用Lodash的_.orderBy处理Knockout的observableArray时踩了参数格式的坑,我来帮你捋清楚问题和解决办法:
错误原因
你写的两种排序参数格式都不符合Lodash orderBy的要求:
- 方法1里的
{ 'Name': String }:你把String构造函数当成了排序迭代器,但Lodash尝试调用它时,上下文不对导致抛出"apply is not a function"异常。 - 方法2里的
{ 'Name' }:这是不完整的对象字面量(虽然JS语法允许,但Lodash无法识别这种格式作为排序依据,会误把它当作函数处理,进而报错)。
正确的排序写法
1. 基础按属性排序(最常用)
如果只是单纯按Name属性升序排序,直接传属性名字符串即可,不需要包裹成对象:
// 获取observableArray的原始数组,排序后再塞回去更新视图 const sortedReviews = _.orderBy(self.reviews(), 'Name', ['asc']); self.reviews(sortedReviews);
如果有多个排序条件,用数组传递属性名和对应排序方向:
// 示例:先按Name升序,再按创建时间降序 const sortedReviews = _.orderBy(self.reviews(), ['Name', 'CreateTime'], ['asc', 'desc']); self.reviews(sortedReviews);
2. 自定义排序逻辑(比如忽略大小写)
如果需要对Name做特殊处理(比如不区分大小写排序),可以传递一个迭代器函数:
const sortedReviews = _.orderBy( self.reviews(), [item => item.Name.toLowerCase()], // 自定义迭代器,把Name转成小写再排序 ['asc'] ); self.reviews(sortedReviews);
关键提醒
别忘了Knockout的observableArray需要调用它的赋值方法(self.reviews(newValue))才能更新视图,排序后的结果一定要重新赋值回去哦。
内容的提问来源于stack exchange,提问作者Lakshmi
相关产品推荐
相关产品推荐

