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

Jon*_*noT 3 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()
   ...
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我希望能够创建一个新的CompanyModel记录(并且为此添加一个或多个联系人模型),但是在我准备这样做之前,它不会出现在控制器的CompanyModel实例中. .

目前,当用户想要添加新记录时,我有一个在我的控制器中调用操作的组件,如下所示:

@set('new_company',
  @store.createRecord('company')
)
Run Code Online (Sandbox Code Playgroud)

除了一件事,这实际上工作正常.我的视图必须填充"new_company"中的各个属性,但是,记录会立即添加到控制器的模型实例中并显示在记录列表中; 我只希望在特定操作发生后,新创建的记录在表格中可见.

我没有用createRecord实例化new_company,而是可以这样做:

@set('new_company',
  Ember.Object.create
    companyname: ''
    desc: ''
    contacts: [
      firstname: ''
      lastname: ''
    ]
)
Run Code Online (Sandbox Code Playgroud)

然后做一个@ store.createRecord('company',@ get('new_company')),但是,鉴于我已经在模型中定义了我的属性,它对我来说感觉不是很干.

我使用的是Ember 1.5.0和Ember-Data 1.0.0-beta.7.

看来我不是第一个遇到这个问题的人(在Ember-Data中创建临时非持久性对象),但似乎Ember-Data已经充分改变,使所有这些解决方案无法运行.

谢谢你的帮助!

Kin*_*n2k 5

你真正的问题是你正在使用被认为是真人秀的东西.我将在你的路线中假设你做了这样的事情:

App.FooRoute = Em.Route.extend({
  model: function(){
    return this.store.find('company');
  }
});
Run Code Online (Sandbox Code Playgroud)

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();
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

示例: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)
});
Run Code Online (Sandbox Code Playgroud)

然后在您的模板中,您将迭代计算属性

{{#each item in savedRecords}}

{{/each}}
Run Code Online (Sandbox Code Playgroud)

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