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

Hao*_* Li 3 ember.js ember-data

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

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


附加问题:

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

Mik*_*tti 7

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

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

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

myrecord.serialize()
Run Code Online (Sandbox Code Playgroud)

serialize()灰烬的数据模型的功能将使用模型的商店的系列化stragey返回模型的JSON表示.在引擎盖下意味着在DS.Serializer的实例上调用serialize().请参见DS.Model.serialize()

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

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

控制台日志输出将是:

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

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

  • `serialize(myrecord)`不起作用,因为`DS.Serializer` __class__没有序列化方法.因此,当您调用`DS.Serializer.serialize(myrecord)时,您会得到未定义的方法错误.就像你调用`DS.Serializer.randomMethodName()`一样.serialize方法仅适用于DS.Serializer的__instances__.例如`var serializer = DS.FixtureSerializer.create({}); serializer.serialize(myrecord);`会工作的. (2认同)