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

Ember控制器类中自定义sort函数如何访问参数及类属性?

解决Ember控制器中排序函数的参数与this访问问题

嘿,我懂你遇到的这个困扰——在Ember控制器里用Array.sort()时,既想传额外参数,又要访问控制器的类属性,确实容易卡壳。下面给你几个实用的解决方案,都是适配Ember场景的:

方法一:用箭头函数包装,保留this并传递参数

箭头函数的特性就是不会改变this的指向,刚好能帮你把控制器的this保留到排序函数里,同时还能轻松传递额外参数。

调用方式修改:

myArr.sort((a, b) => this.sortArrayBy(a, b, key));

排序函数调整:

sortArrayBy: function(a, b, key) {
  // 现在可以正常访问控制器的sortKey属性了
  let param = this.get('sortKey');
  
  // 如果你需要用到传入的key参数,比如用它来取a/b的属性,也直接用就行
  // 比如:const valA = a[key]; const valB = b[key];
  
  if (a[param] < b[param]) return -1;
  if (a[param] > b[param]) return 1;
  return 0;
},

这种方式最直观,也符合现代JS的写法,Ember对箭头函数的支持也很好。

方法二:用bind()绑定this与预传参数

如果你更习惯用传统函数写法,Function.bind()也是个靠谱的选择,它能帮你把控制器的this绑定到排序函数上,还能预先传入额外参数。

调用方式修改:

// 第一个参数绑定控制器的this,第二个参数是你要传的额外key
myArr.sort(this.sortArrayBy.bind(this, key));

排序函数调整:

注意这里参数顺序要变,先接收预传的key,再是排序需要的a和b:

sortArrayBy: function(key, a, b) {
  let param = this.get('sortKey');
  
  // 同样可以使用传入的key参数
  if (a[param] < b[param]) return -1;
  if (a[param] > b[param]) return 1;
  return 0;
},

额外说明

你之前尝试的myArr.sort(this.sortArrayBy, key)是误区——Array.sort()的第二个参数是用来指定排序函数执行时的this值,不是额外参数,所以没法直接传key进去,这也是你拿不到它的原因。

另外,如果你是在Ember里处理列表排序,也可以考虑用Ember内置的SortableMixin,它能更优雅地处理排序逻辑,但如果是手动调用sort()的场景,上面两种方法就足够解决问题了。

内容的提问来源于stack exchange,提问作者copenndthagen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:34:11