Ember.js - 为什么 this.get('model') 会返回一个控制器
Ember.js—Why would this.get('model') return a controller?
这是一个jsfiddle演示:http://jsfiddle.net/YUHLA/5/
这是我在尝试找出创建新记录的正确模式时遇到的问题。我无法保存新创建的记录,并且在途中遇到了一些奇怪的行为。
打开控制台,然后尝试添加新帖子并保存。请注意三个奇怪的情况:
- 在控制器上调用 get('model'( 将返回第 62 行的控制器。
- 在第 65 行,证明没有新模型保存到灯具中。
- 从后站控制器创建另一个帖子并保存后,两个帖子都会被保存(第 70 行(。
这是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);
});
});
}
});
这是否与我从帖子控制器创建模型,然后将其保存在后期控制器中的事实有关?如果是这样,我该如何解决这个问题?
谢谢!
这是否与我从帖子控制器创建模型,然后将其保存在后期控制器中的事实有关?
不。
- 在控制器上调用 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((,这样做只是令人困惑,可能不是您想要的。一般来说,最好让余烬创造东西。
- 从后站控制器创建另一个帖子并保存后,两个帖子都会被保存(第 70 行(。
右。因为 commit(( 是在 App.store(( 上调用的,所以 App.Post 的存储仍然有一个未提交的记录。App.createRecord({}(.get('store'(.commit(( 在该存储中创建第二条记录,然后提交两条记录。
在这里更新小提琴:http://jsfiddle.net/YUHLA/7/
- 节点导出返回一个空对象
- Angular js-返回一个包含类似
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- Javascript:在激发函数后返回一个变量以供使用
- Protractor:element.getText()返回一个对象,而不是String
- JSTree's data.rslt.obj.text()返回一个文本数组,而不是所需节点的文本
- 我应该返回一个类似console.log()的方法调用吗
- 从 javascript 中的对象方法返回一个对象
- new SharedWorker(“whatever.js”)返回一个错误
- 从js中的对象返回一个值
- 乘法返回一个奇怪的结果
- 返回一个关联数组,而不是mongoose中的文档数组
- 为什么我的$http.post返回一个400错误
- 返回一个新函数,而不是工厂中的对象
- 从javascript函数返回一个对象
- 从 angularjs 中的嵌套成功函数返回一个值
- 将字符串转换为数组使用javascript更新一个值并返回一个字符串
- jQuery's$.post只返回一个空白数据