You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:57:36