有没有办法直接在索引页面的主 javascript 中调用 Ember 数据函数,例如serialize
函数?
我试过DS.Serializer.serialize(myrecord)
了,但我得到了这个错误:has no method 'serialize'
。
附加问题:
如何直接调用RESTAdapter 的 serialize 版本?他们对通用序列化做了一些修改。
有没有办法直接在索引页面的主 javascript 中调用 Ember 数据函数,例如serialize
函数?
我试过DS.Serializer.serialize(myrecord)
了,但我得到了这个错误:has no method 'serialize'
。
附加问题:
如何直接调用RESTAdapter 的 serialize 版本?他们对通用序列化做了一些修改。
有没有办法直接在索引页面的主 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
这个答案可能会更新一些。
如果您的模型名称是“post”,它将是:
const serializer = this.get('store').serializerFor('post');
这使您可以访问所有序列化程序功能。
serializer.serialize(myRecord);
如果您没有序列化程序的关联模型,Ember 会抱怨。