gpt4 book ai didi

sorting - Emberjs高级排序hasMany关联作为计算属性

转载 作者:行者123 更新时间:2023-12-02 06:08:21 25 4
gpt4 key购买 nike

我问了这个问题here的变体。但是基本上我需要创建一个对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目前无法正常工作(出于除此问题以外的其他原因)。我已经发布了有关 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')返回了一个promise,所以我认为我会尝试这样做;
  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排序并返回所需的排序对象。

最佳答案

好吧,首先您的JSBin有很多问题,所以让我们一一扔掉

1-您未包含任何Ember-Data构建,因此我包含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>

关于sorting - Emberjs高级排序hasMany关联作为计算属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30926478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com