如何直接调用Ember数据功能?

时间:2013-07-09 02:17:55

标签: ember.js ember-data

有没有办法调用Ember数据函数,例如serialize function,直接在索引页面的主要javascript中?

我试过了DS.Serializer.serialize(myrecord),但我收到了这个错误:has no method 'serialize'


其他问题:

如何直接拨打RESTAdapter's version of serialize?他们对generic serialize进行了一些修改。

2 个答案:

答案 0 :(得分:7)

  

有没有办法调用Ember数据函数,例如serialize函数,直接在我的索引页面的主要javascript里面?

是和否。是的,因为ember-data函数没有什么特别之处(它们可以从任何地方调用)但是没有,因为调用DS.Serializer.serialize(myrecord)没有意义。

您可能要做的是序列化myrecord?在这种情况下,尝试:

myrecord.serialize()

ember-data模型的serialize()函数将使用模型存储的序列化stragey来返回模型的JSON表示。在引擎盖下意味着在DS.Serializer的实例上调用serialize()。见DS.Model.serialize()

  

我尝试过DS.Serializer.serialize(myrecord),但是我收到了这个错误:没有方法'序列化'

右。 DS.Serializer是一个类,没有serialize方法。所以DS.Serializer.serialize(myrecord)不起作用。您链接的serialize函数是一个实例方法,因此它将在DS.Serializer类的实例上可用。也就是说,DS.Serializer是一个抽象基类,因此创建它的实例并尝试在其上调用serialize()没有多大意义。

有关ember-data序列化工具如何工作的更多信息,请查看[serializer api docs](https://github.com/emberjs/data/blob/761412849a56ad086c44659faafa547d8f6c03a8/packages/ember-data/lib/system/serializer.js#L10-L211

- 更新了其他问题: -

  

如何直接调用RESTAdapter的序列化版本?他们对通用序列化进行了一些修改。

如果使用RESTAdapter,您只需在模型上调用model.serialize()即可。但在极少数情况下,您的模型正在使用其他东西(如FixtureAdapter)并且您需要RESTSerializer的序列化功能,您可以使用DS.RESTSerializer.create({})创建序列化程序,然后将模型传递给其serialize()方法。例如:

App = Ember.Application.create();
App.Store = DS.Store.extend({adapter: 'DS.FixtureAdapter'});
App.Post = DS.Model.extend({
  title: DS.attr('string'),
  bodyText: DS.attr('string')
});
App.ApplicationRoute = Ember.Route.extend({
  model: function() {
    return App.Post.createRecord({title: 'This is my post', bodyText: 'There are many like it but this one is mine'});
  },
  afterModel: function(model, transition) {
    var serializer = DS.RESTSerializer.create({});
    console.log('FixtureSerializer via model.serialize(): ', model.serialize());
    console.log('RESTSerializer via serializer.serialize(post):', serializer.serialize(model));
  }
});

控制台日志输出将为:

> FixtureSerializer via model.serialize():  Object {title: "This is my post", bodyText: "There are many like it but this one is mine"}
> RESTSerializer via serializer.serialize(post): Object {title: "This is my post", body_text: "There are many like it but this one is mine"}

您可以看到RESTSerializer将bodyText属性从camelCase转换为下划线。现场示例如下:http://jsbin.com/uduzin/3/edit

答案 1 :(得分:0)

此答案可能是最新的。

如果您的模型名称为“ post”,则为:

const serializer = this.get('store').serializerFor('post');

,使您可以访问所有serializer函数。

serializer.serialize(myRecord);

如果您没有与序列化器关联的模型,Ember会抱怨。