Emberjs 高级排序 hasMany 关联作为计算 属性
Emberjs advanced sort hasMany association as a computed property
我问过这个问题的变体 . But basically I need to create a computed property that operated on a hasMany association. I need to do sorting similar to the 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 目前无法正常工作(除了这个问题以外的原因)。我已经发布了一个关于 here 的问题。我只是不想拖延这个问题的答案。
更新 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('files.@each.name')
执行此操作时出现以下错误:
Uncaught TypeError: this.get(...).sort is not a function
所以既然 this.get('files')
return 是一个承诺,我想我会试试这个;
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 排序和 return 所需的排序对象。
好的,首先你的 JSBin 有很多问题,所以让我们一个一个地解决它们
1- 你没有包含任何 Ember- 数据构建,所以我包含了 1,这是灯具和模型所需要的
<script src="http://builds.emberjs.com/tags/v1.0.0-beta.15/ember-data.js"></script>
2- 您的脚本
var App = window.App = Ember.Application.create({
});
//First this is how to register the adapter
App.ApplicationAdapter = DS.FixtureAdapter.extend({});
App.IndexRoute = Ember.Route.extend({
model: function() {
//Second with find you pass in the ID so I am using 1
//if you want to get all folders use findAll()
return this.store.find('folder',1);
}
});
App.IndexController = Ember.Controller.extend({
});
App.Router.map(function() {
});
App.Folder = DS.Model.extend({
name: DS.attr('string'),
files: DS.hasMany('file',{async:true}),
sortedFiles: function(){
//Sorty By has no second parameter, if you need more sorting power, do it your self
return this.get('files').sortBy('name');
}.property('files.@each.name')
});
App.File = DS.Model.extend({
name: DS.attr('string'),
folder: DS.belongsTo('folder',{async:true})
});
App.File.FIXTURES = [
{
id: 1,
name: 'File 5',
folder:1
},
{
id: 2,
name: 'File 1',
folder:1
},
{
id: 3,
name: 'File 3',
folder:1
},
{
id: 4,
name: 'File 2',
folder:2
},
{
id: 5,
name: 'File 6',
folder:2
},
{
id: 6,
name: 'File 4',
folder:2
}
];
App.Folder.FIXTURES = [
{
id: 1,
name: 'Folder 1',
files:[1,2,3]
},
{
id: 2,
name: 'Folder 2',
files:[4,5,6]
}
];
您的模板:
<div>
Folders: <br>
<ul>
<li>
Name: {{model.name}} <br>
Files:
{{!-- here we access the sorted files property in the model--}}
{{#each file in model.sortedFiles}}
{{file.name}} <br/>
{{/each}}
</li>
</ul>
</div>
我问过这个问题的变体
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 目前无法正常工作(除了这个问题以外的原因)。我已经发布了一个关于 here 的问题。我只是不想拖延这个问题的答案。
更新 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('files.@each.name')
执行此操作时出现以下错误:
Uncaught TypeError: this.get(...).sort is not a function
所以既然 this.get('files')
return 是一个承诺,我想我会试试这个;
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 排序和 return 所需的排序对象。
好的,首先你的 JSBin 有很多问题,所以让我们一个一个地解决它们
1- 你没有包含任何 Ember- 数据构建,所以我包含了 1,这是灯具和模型所需要的
<script src="http://builds.emberjs.com/tags/v1.0.0-beta.15/ember-data.js"></script>
2- 您的脚本
var App = window.App = Ember.Application.create({
});
//First this is how to register the adapter
App.ApplicationAdapter = DS.FixtureAdapter.extend({});
App.IndexRoute = Ember.Route.extend({
model: function() {
//Second with find you pass in the ID so I am using 1
//if you want to get all folders use findAll()
return this.store.find('folder',1);
}
});
App.IndexController = Ember.Controller.extend({
});
App.Router.map(function() {
});
App.Folder = DS.Model.extend({
name: DS.attr('string'),
files: DS.hasMany('file',{async:true}),
sortedFiles: function(){
//Sorty By has no second parameter, if you need more sorting power, do it your self
return this.get('files').sortBy('name');
}.property('files.@each.name')
});
App.File = DS.Model.extend({
name: DS.attr('string'),
folder: DS.belongsTo('folder',{async:true})
});
App.File.FIXTURES = [
{
id: 1,
name: 'File 5',
folder:1
},
{
id: 2,
name: 'File 1',
folder:1
},
{
id: 3,
name: 'File 3',
folder:1
},
{
id: 4,
name: 'File 2',
folder:2
},
{
id: 5,
name: 'File 6',
folder:2
},
{
id: 6,
name: 'File 4',
folder:2
}
];
App.Folder.FIXTURES = [
{
id: 1,
name: 'Folder 1',
files:[1,2,3]
},
{
id: 2,
name: 'Folder 2',
files:[4,5,6]
}
];
您的模板:
<div>
Folders: <br>
<ul>
<li>
Name: {{model.name}} <br>
Files:
{{!-- here we access the sorted files property in the model--}}
{{#each file in model.sortedFiles}}
{{file.name}} <br/>
{{/each}}
</li>
</ul>
</div>