2

この質問の変形をここで尋ねました。しかし、基本的には、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 の並べ替えを使用して、目的の並べ替えられたオブジェクトを返すことができました。

4

1 に答える 1

2

まず第一に、あなたの JSBin には多くの問題があったので、それらを 1 つずつ投げてみましょう

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>
于 2015-06-19T01:53:14.417 に答える