这是一个jsfiddle演示:http://jsfiddle.net/YUHLA/5/
这是我在尝试找出创建新记录的正确模式时遇到的问题。我无法获得新创建的记录,我在途中遇到了一些奇怪的行为。
打开控制台,尝试添加新帖并保存。注意三个奇数:
这是javascript:
window.App = Ember.Application.create();
App.Store = DS.Store.extend({
adapter: DS.FixtureAdapter
});
App.store = App.Store.create();
App.Post = DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string')
});
App.Post.FIXTURES = [
{
id: 1,
title: 'title',
body: 'body'
}, {
id: 2,
title: 'title two',
body: 'body two'
}
];
App.NewPostFormView = Ember.View.extend({
tagName: "form",
templateName: "newPostForm",
submit: function() {
this.get('controller').save();
return false;
}
});
App.ApplicationController = Ember.ObjectController.extend({
posts: (function() {
return App.Post.find();
}).property()
});
App.PostsController = Ember.ArrayController.extend({
sortProperties: ['id'],
sortAscending: false,
itemController: 'post',
newPost: function() {
var post;
return post = App.Post.createRecord({
title: '',
body: '',
isEditing: true
});
}
});
App.PostController = Ember.ObjectController.extend({
save: function() {
var temp;
console.log('Starting to save');
console.log('this.get(\'model\') =', this.get('model'));
transaction = App.store.transaction();
this.set('isEditing', false);
temp = this.get('model');
temp.get('store').commit();
Ember.run.next(function(){
console.log('# fixtures:', App.Post.FIXTURES.length);
App.Post.createRecord(
{title: 'post four', body: 'four body'}
).get('store').commit()
Ember.run.next(function(){
console.log('# fixtures:', App.Post.FIXTURES.length);
});
});
}
});
这是否与我从posts控制器创建模型,然后将其保存在post控制器中的事实有关?如果是这样,我该如何解决这个问题?
谢谢!
答案 0 :(得分:2)
这是否与我从posts控制器创建模型,然后将其保存在post控制器中的事实有关?
没有
- 在控制器上调用get('model')将返回第62行的控制器。
醇>
右。 PostsController
已指定itemController: 'post'
,因此当帖子模板重复{{each post in controller}}
时,帖子将被包含在PostController
中。这很好但不与{{render}}
助手结合使用。当{{render}}
在每个块中使用{{render post post}}
时,它会呈现帖子模板并将指定的值(post变量)包装在PostController中。所以你有两个邮政控制器包装一个帖子模型。有点矫枉过正。
- 在第65行,证明没有新模型保存到灯具中。
醇>
这里的问题是你有两个不同的商店。 App.store()是在第14行创建的全局变量。由于它是第一个创建的变量,因此它是default store
。它与您的模型使用的无关。
在PostController.save()中,this.get('model')
正在返回一个控制器。控制器的商店是默认商店。这通常与模型的商店相同,但在这种情况下不同。因此,当您调用默认商店中没有模型的get('store').commit()
时,没有任何反应。如果你真的有一个模型(通过修复问题#1),那就没关系了。或者,如果您没有创建App.store
,那也可以,因为在这种情况下,默认商店将与您的模型商店相同。
建议不要自己创建App.store(),这样做只是令人困惑,可能不是你想要的。一般来说,最好让ember创造东西。
- 从帖子控制器创建另一个帖子并保存后,两个帖子都被保存(第70行)。
醇>
右。因为在App.store()上调用了commit(),App.Post的商店仍然有一个未提交的记录。 App.createRecord({})。get('store')。commit()在该商店中创建第二条记录,然后同时提交。
此处更新了小提琴:http://jsfiddle.net/YUHLA/7/