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
相关产品推荐
相关产品推荐

