以下のようなレイアウトのアプリを作っています。
新しい投稿を作成したいので、「新しい投稿ボタン」を押すと、「投稿/新しい」ルートに移動しました。
私のPostsNewRouteは以下のようなものです(私はここで説明されている方法に従いました)
App.PostsNewRoute = Ember.Route.extend({
model: function() {
// create a separate transaction,
var transaction = this.get('store').transaction();
// create a record using that transaction
var post = transaction.createRecord(App.Post, {
title: 'default placeholder title',
body: 'default placeholder body'
});
return post;
}
});
すぐに新しいレコードを作成し、投稿のリストを更新し、新しい投稿のフォームを表示します。
今、私は2つの問題を抱えています。
1つは投稿リストの順序です。
新しい投稿がリストの一番上になると思っていましたが、リストの一番下にあります。
バックエンドとしてレールを使用しており、Postモデルの順序を次のように設定しています。
default_scope order('created_at DESC')
そのため、古い投稿は既存の投稿内の下にあります。しかし、新しく作成されたものはそうではありません。(まだバックエンドにコミットされていません)
もう1つは、リストで作成された投稿をクリックしたときです。
投稿リストで新しく作成した投稿をクリックできます。そしてそれは私をURLのある投稿ページに連れて行った
/posts/null
そしてそれは私が防がなければならない非常に奇妙な行動です。
2つの解決策があると思います。
[新しい投稿]ボタンをクリックすると、レコードを作成してすぐにサーバーにコミットし、サーバーが新しいレコードを正常に保存したら、投稿リストを更新して、新しく作成した投稿の編集モードに入ります。
または、最初にRouteのモデルをnullに設定し、PostsNewViewの[送信]ボタンをクリックしたときにレコードを作成します。
またはshowは、属性がである投稿のみを表示します
'isNew' = false, 'isDirty' = false,
リストに..
しかし悲しいことに、私はどちらの方法から始めればよいのかわかりません...
解決策1の場合、私は完全に道に迷います。
ソリューション2の場合、入力フォームのデータをまだ存在しないモデルにバインドする方法がわかりません。
解決策3の場合、私は完全に道に迷います。
私を助けてください!残り火の意図した方法はどれですか?
(Emberはすべての開発者に同じソリューションを使用することを目的としていると聞きました)
アップデート
現在、ソリューション3を使用していますが、まだ注文の問題があります。これが私の投稿テンプレートコードです。
<div class="tools">
{{#linkTo posts.new }}new post button{{/linkTo}}
</div>
<ul class="post-list">
{{#each post in filteredContent}}
<li>
{{#linkTo post post }}
<h3>{{ post.title }}</h3>
<p class="date">2013/01/13</p>
<div class="arrow"></div>
{{/linkTo}}
</li>
{{/each}}
</ul>
{{outlet}}
アップデート
'content'ではなく'arrangedContent'をフィルタリングすることでこの問題を解決しました
App.PostsController = Ember.ArrayController.extend({
sortProperties: ['id'],
sortAscending: false,
filteredContent: (function() {
var content = this.get('arrangedContent');
return content.filter(function(item, index) {
return !(item.get('isDirty'));
});
}).property('content.@each')
});