我正在构建一个具有如下布局的应用程序。
我想创建一个新帖子,所以我按下了“新帖子按钮”,它把我带到了“帖子/新”路线。
我的 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;
}
});
它会立即创建一条新记录,更新帖子列表,并显示新帖子的表单。
(来源: sununderground.kr )
现在我有两个问题。
一是帖子列表的顺序。
我预计新帖子会在列表的顶部,但它在列表的底部。
我使用 rails 作为后端,并将 Post 模型顺序设置为
default_scope order('created_at DESC')
所以旧帖子位于现有帖子的下方。但新创建的不是。(尚未提交到后端)
另一个是当我单击列表中的已创建帖子时
我可以在帖子列表中单击我新创建的帖子。它把我带到了一个带有 URL 的帖子页面
/posts/null
这是我必须防止的非常奇怪的行为。
我认为会有两种解决方案。
当我单击“新帖子按钮”创建记录并立即提交到服务器时,当服务器成功保存我的新记录时,刷新帖子列表并进入新创建帖子的编辑模式。
或最初将 Route 的模型设置为 null 并在我单击 PostsNewView 中的“提交”按钮时创建一条记录。
或 show 仅显示属性为
'isNew' = false, 'isDirty' = false,
在列表中..
但可悲的是,我不知道从哪里开始……
对于解决方案 1,我完全迷路了。
对于解决方案 2,我不知道如何将输入表单中的数据与尚不存在的模型绑定。
对于解决方案 3,我完全迷路了。
请帮我!这将是 ember 的预期方式?
(我听说 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}}
更新
我通过过滤“arrangedContent”而不是“content”解决了这个问题
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')
});