使用Ember-Data 1.0.0-beta的临时非持久性记录

时间:2014-06-13 03:51:31

标签: ember.js ember-data

我是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已经发生了充分的变化,使所有这些解决方案无法运行。

感谢您的帮助!

1 个答案:

答案 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}}

示例:http://emberjs.jsbin.com/OxIDiVU/640/edit