3

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

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


附加问题:

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

4

2 回答 2

7

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

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

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

myrecord.serialize()

serialize()ember-data 模型的函数将使用模型存储的序列化策略来返回模型的 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));
  }
});

控制台日志输出将是:

> 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

于 2013-07-09T05:31:56.453 回答
0

这个答案可能会更新一些。

如果您的模型名称是“post”,它将是:

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

这使您可以访问所有序列化程序功能。

serializer.serialize(myRecord);

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

于 2018-12-27T23:11:34.257 回答