我正在开发一个Ember.js应用程序,目前我尝试实现用户注册。到目前为止,我找到了两种方法来实现这一点,但两者都有一些缺点。
一种方法是拥有一个注册控制器,它会向服务器发送带有电子邮件,密码和密码确认值的自定义ajax帖子。我不喜欢这个地方的自定义ajax调用,我更喜欢使用EmberData用户模型并保存它,但我不想在客户端存储密码和密码确认值。
我发现有一种方法可以从服务器接收模型的元数据,所以我的问题是,还有一种方法可以将元数据保存到服务器吗?
也欢迎不在客户端存储密码的其他解决方案。
答案 0 :(得分:7)
当然,创建一个自定义序列化程序并覆盖序列化
App.UserSerializer = DS.RESTSerializer.extend({
serialize: function(record, options) {
var json = this._super(record, options);
// assuming niner isn't an attr on the model definition
// just a value added to the model that I want to include in the meta data
json.meta = { typedPass: record.get('typedPass') };
return json;
}
});
顺便说一下,你绝对不应该存储,也不应该将密码传输给客户端。我假设您正在编写某种登录页面但并不打算这样做,我只是将其编写为CYA。
//没有定义密码,它只会发送id和user属性。
App.User = DS.Model.extend({
user: DS.attr()
});
App.ApplicationRoute = Em.Route.extend({
model: function(){
var user = this.get('store').createRecord('user', {user:'cow'});
user.set('typedPass', 'some crazy cow password'); // the default serializer wouldn't attach this when you save
user.save();
}
});
答案 1 :(得分:1)
创建自定义序列化程序并覆盖序列化为@ Kingpin2k,如果您可以将元数据作为用户有效负载的一部分,则可以正常工作。例如:
{
"user":{
"firstName":"Jim",
"meta":{
"password":"my password"
}
}
}
但是如果你想让'meta'遵循与服务器响应相同的结构,那么你想要覆盖serializeIntoHash:
App.UserSerializer = DS.RESTSerializer.extend({
serializeIntoHash(data, type, record, options) {
this._super(data, type, record, options);
data.meta = {
password: record.get('password')
};
}
});
这会将一个看起来像这样的有效负载发送到服务器:
{
"user":{
"firstName":"Jim"
},
"meta":{
"password":"my password"
}
}
您仍然需要在模型上设置密码,如@ Kingpin2k建议:
model.set('password', 'my password');