この質問の変形をここで尋ねました。しかし、基本的には、hasMany 関連付けを操作する計算プロパティを作成する必要があります。JavaScript のsort関数と同様のソートを行う必要があります。次のようなことができる場所
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 の並べ替えを使用して、目的の並べ替えられたオブジェクトを返すことができました。