我是Ember和Ember数据的新手,我决定是否使用Ember-Data或其他一个持久性库。为了评估,我正在尝试编写一个小型的Rails支持的应用程序。
我的其中一条路线可以被认为类似于示例中经常使用的Todo MVC应用程序。
在我的模板中,我有许多输入字段来表示模型中的属性。此外,我在模型中还有一个表示hasMany关系的元素。
型号:
App.CompanyModel = DS.Model.extend
company: DS.attr()
desc: DS.attr()
contacts: DS.hasMany('company_contact')
App.CompanyContactModel = DS.Model.extend
firstname: DS.attr()
lastname: DS.attr()
...
在我的控制器中,我希望能够创建一个新的CompanyModel记录(并且已经为其添加了一个或多个联系人模型),但是它不会出现在CompanyModel的控制器实例中,直到我已经准备好了。
目前,当用户想要添加新记录时,我有一个在我的控制器中调用操作的组件,如下所示:
@set('new_company',
@store.createRecord('company')
)
除了一件事,这实际上工作正常。我的视图必须填充" new_company"中的各个属性,但是,记录会立即添加到控制器的模型实例中并显示在记录列表中;我只希望在特定操作发生后,新创建的记录在表格中可见。
我没有使用createRecord实例化new_company,而是可以这样做:
@set('new_company',
Ember.Object.create
companyname: ''
desc: ''
contacts: [
firstname: ''
lastname: ''
]
)
然后执行@ store.createRecord(' company',@ get(' new_company')),但是,鉴于我已经在模型中定义了我的属性,它对我来说感觉不太干。
我使用的是Ember 1.5.0和Ember-Data 1.0.0-beta.7。
看来我不是第一个遇到此问题的人(create temporarty non persistent object in Ember-Data),但似乎Ember-Data已经发生了充分的变化,使所有这些解决方案无法运行。
感谢您的帮助!
答案 0 :(得分:5)
您真正的问题是您正在使用被认为是真实收藏的内容。我将在你的路线中假设你做过这样的事情:
App.FooRoute = Em.Route.extend({
model: function(){
return this.store.find('company');
}
});
没有参数的 find
说,嘿Ember Data,找到我公司的所有记录。 Ember Data会向您的后端发出请求,然后返回store.all('company')
。 all
是一个实时集合,它将始终包含当前存储在该类型中的所有类型的记录。在你的情况下,你说我想避免任何新的记录。有几种方法可以解决这个问题。
App.FooRoute = Em.Route.extend({
model: function(){
return this.store.find('company').then(function(companies){
return companies.toArray();
});
}
});
示例:http://emberjs.jsbin.com/OxIDiVU/641/edit
App.FooRoute = Em.Route.extend({
model: function(){
return this.store.find('company');
}
});
App.FooController = Em.ArrayController.extend({
savedRecords: function(){
return this.get('model').filterBy('isNew', false);
}.property('model.@each.isNew')
// shorthand this could be written like this
// savedRecords: Ember.computed.filterBy('model', 'isNew', false)
});
然后在模板中迭代计算属性
{{#each item in savedRecords}}
{{/each}}