我在这里问了这个问题的一个变体。但基本上我需要创建一个对 hasMany 关联进行操作的计算属性。我需要进行类似于 javascript排序功能的排序;我可以在哪里做类似的事情
files = ["File 5", "File 1", "File 3", "File 2"];
files.sort(function(a,b){
return parseInt(b.split(' ').pop()) - parseInt(a.split(' ').pop())
});
结果:
["File 5", "File 3", "File 2", "File 1"]
这是我的 jsbin: http ://emberjs.jsbin.com/simayexose/edit?html,js,output
任何帮助将不胜感激。
注意:我的 jsbin 目前无法正常工作(除了这个问题之外的其他原因)。我在这里发布了一个关于此的问题。我只是不想保留这个问题的答案。
更新 1
谢谢@engma。我执行了这些说明。事实上,我复制并粘贴了发布的内容。这是新的 jsbin。 http://emberjs.jsbin.com/roqixemuyi/1/edit?html,js,输出
不过,我仍然没有得到任何排序。即使它这样做了,它仍然不会按照我想要的方式进行排序。
我需要以下内容:(以下是我尝试在我的代码中实现它时得到的错误,而不是来自 jsbin,因为我无法让 jsbin 工作)
sortedFiles: function(){
return this.get('files').sort(function(a,b){
return parseInt(b.split(' ').pop()) - parseInt(a.split(' ').pop());
});
}.property('files.@each.name')
当我这样做时,我收到以下错误:
Uncaught TypeError: this.get(...).sort is not a function
所以既然this.get('files')
返回了一个承诺,我想我会试试这个;
sortedFiles: function(){
return this.get('files').then(function(files){
return files.sort(function(a,b){
return parseInt(b.split(' ').pop()) - parseInt(a.split(' ').pop());
});
});
}.property('files.@each.name')
但后来我收到以下错误:
Uncaught Error: Assertion Failed: The value that #each loops over must be an Array. You passed {_id: 243, _label: undefined, _state: undefined, _result: undefined, _subscribers: }
顺便说一句,我使用的是 emberjs v1.11.0
而且,我使用的 sortBy 是ember-cli/node_modules/bower-config/node_modules/mout/array/sortBy.js
这是它的代码
var sort = require('./sort');
var makeIterator = require('../function/makeIterator_');
/*
* Sort array by the result of the callback
*/
function sortBy(arr, callback, context){
callback = makeIterator(callback, context);
return sort(arr, function(a, b) {
a = callback(a);
b = callback(b);
return (a < b) ? -1 : ((a > b) ? 1 : 0);
});
}
module.exports = sortBy;
更新 2
因此,要回答如何将 Emberjs 高级排序 hasMany 关联作为计算属性的问题;我不得不改变
this.get('files').sort(function(a,b){
...
});
return this.get('files').toArray().sort(function(a,b){
...
});
这允许我使用 javascript 排序并返回所需的排序对象。