Я задал вариант этого вопроса здесь. Но в основном мне нужно создать вычисляемое свойство, которое работает с ассоциацией 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,output
Я все еще ничего не отсортировал, хотя. А даже если бы и было, то все равно не разобрались бы так, как хотелось бы.
Мне нужно что-то вроде следующего: (ниже приведены ошибки, которые я получаю, когда пытаюсь реализовать это в своем коде, а не из jsbin, так как я не могу заставить jsbin работать)
sortedFiles: function(){
return this.get('files').sort(function(a,b){
return parseInt(b.split(' ').pop()) - parseInt(a.split(' ').pop());
});
}.property('[email protected]')
Когда я это делаю, я получаю следующую ошибку:
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('[email protected]')
Но затем я получаю следующую ошибку:
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 и возвращать нужные отсортированные объекты.