計算されたプロパティを使用してさまざまな配列を組み合わせてから、Javascript の組み込みの並べ替えを使用して、組み合わせた結果を並べ替えることができます。
配列を結合して並べ替える
複数の配列を結合するための計算されたプロパティ:
stream: function() {
var post = this.get('post'),
bookmark = this.get('bookmark'),
photo = this.get('photo');
var stream = [];
stream.pushObjects(post);
stream.pushObjects(bookmark);
stream.pushObjects(photo);
return stream;
}.property('post.@each', 'bookmark.@each', 'photo.@each'),
すべての項目を含む結果の計算されたプロパティを並べ替える例:
//https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort
streamSorted: function() {
var streamCopy = this.get('stream').slice(); // copy so the original doesn't change when sorting
return streamCopy.sort(function(a,b){
return a.get('publishtime') - b.get('publishtime');
});
}.property('stream.@each.publishtime')
});
プロパティまたはそのタイプに基づいてアイテムをレンダリングする
私はこれを行う2つの方法を知っています:
- 各オブジェクトにブール値のプロパティを追加し、ハンドルバーを使用し
{{#if}}
てそのプロパティをチェックし、正しいビューをレンダリングします
- 計算されたプロパティを拡張
Ember.View
して使用し、レンダリングされるオブジェクトのタイプに基づいてレンダリングされるテンプレートを切り替えます ( Ember.js を使用してモデル タイプ/オブジェクト値によってビュー テンプレートを選択するに基づく)
方法 1
JS:
App.Post = Ember.Object.extend({
isPost: true
});
App.Bookmark = Ember.Object.extend({
isBookmark: true
});
App.Photo = Ember.Object.extend({
isPhoto: true
});
テンプレート:
<ul>
{{#each item in controller.stream}}
{{#if item.isPost}}
<li>post: {{item.name}} {{item.publishtime}}</li>
{{/if}}
{{#if item.isBookmark}}
<li>bookmark: {{item.name}} {{item.publishtime}}</li>
{{/if}}
{{#if item.isPhoto}}
<li>photo: {{item.name}} {{item.publishtime}}</li>
{{/if}}
{{/each}}
</ul>
方法 2
JS:
App.StreamItemView = Ember.View.extend({
tagName: "li",
templateName: function() {
var content = this.get('content');
if (content instanceof App.Post) {
return "StreamItemPost";
} else if (content instanceof App.Bookmark) {
return "StreamItemBookmark";
} else if (content instanceof App.Photo) {
return "StreamItemPhoto";
}
}.property(),
_templateChanged: function() {
this.rerender();
}.observes('templateName')
})
テンプレート:
<ul>
{{#each item in controller.streamSorted}}
{{view App.StreamItemView contentBinding=item}}
{{/each}}
</ul>
JSBinの例 - ソートされていないリストはメソッド 1 でレンダリングされ、ソートされたリストはメソッド 2 でレンダリングされます