javascript - 将复杂的普通对象转换为领域对象?
问题描述
我正在尝试将接收到的纯 JavaScript 对象直接转换和/或传递给领域对象,但我在这样做时遇到了麻烦。
“设置” - 接收到的普通对象(领域对象转换为 Json 并返回)
realm.create('Settings', {
Id: settings.Id,
User: settings.User,
FavoriteChannels: settings.FavoriteChannels,
}, true)
这是一个简单的示例架构:
exports.Settings = {
name: 'Settings',
primaryKey: 'Id',
properties: {
Id: 'string',
User: 'User',
FavoriteChannels: 'Channel[]',
}
};
exports.User = {
name: 'User',
primaryKey: 'Id',
properties: {
Id: 'string',
FirstName: 'string?',
LastName: 'string?',
PhoneNumbers: 'PhoneNumber[]'
}
};
exports.PhoneNumber = {
name: 'PhoneNumber',
primaryKey: 'Id',
properties: {
Id: 'string',
Number: 'string',
}
};
exports.Channel = {
name: 'Channel',
primaryKey: 'Id',
properties: {
Id: 'string',
ChannelName: 'string?',
Users: 'User[]',
}
};
如果我尝试直接在“realm.create”中传递“设置”,我会收到以下错误:
"User.PhoneNumbers
必须是类型'PhoneNumber[]'
,得到'object' ([object Object]
)
它需要一个数组,但是普通对象的集合被反序列化为对象/字典?(例如。。PhoneNumbers: { '0': [Object] })
反序列化器无法知道如何解析领域对象"List {}"
(例如[PhoneNumbers]: List { [0]: [Object] })
数组。
Realm 似乎对这些操作缺乏“对称性”,除非我遗漏了一些东西。
解决方案
解决它的一种方法是在客户端简单地使用对象构造函数,例如:
//file "dataModel.js"
export function Settings(obj) {
this.Id = obj.Id;
this.User = new User(obj.User); //check for null, if property in the schema is nullable, so you don't pass empty objects to Realm - example: obj.User ? new User(obj.User) : null;
this.FavoriteChannels = Object.values(obj.FavoriteChannels).map(m => new Channel(m));
}
export function User(obj) {
this.Id = obj.Id;
this.FirstName = ojb.FirstName;
this.LastName = obj.LastName;
PhoneNumbers = Object.values(obj.PhoneNubmers).map(m => new PhoneNumber(m));
}
export function PhoneNumber(obj) {
this.Id = obj.Id;
this.Nubmer = obj.Number;
}
export function Channel(obj) {
this.Id = obj.Id;
this.ChannelName = obj.ChannelName;
this.Users = Object.values(obj.Users).map(m => new User(m));
}
//file app.js
import * as dataModel from 'path-to-dataModel';
...
//receive data from server and create Settings using the constructor from dataModel
const testObj = new dataModel.Settings(plainSettingsObjectFromServer);
//make any changes to the testObj and send it back to server
现在我们可以将从客户端接收到的普通对象传递给 Realm.Create:
realm.create('Settings', {
Id: plainSettingsObject.Id,
User: plainSettingsObject.User,
FavoriteChannels: plainSettingsObject.FavoriteChannels,
}, true)
推荐阅读
- javascript - 读取 NFC 标签的消息值 -Phonegap/Cordova 应用程序
- javascript - 在快速路由中使用 find() 时向我的 mongodb 添加过滤可能吗?如何?
- java - 为我的嵌入式码头服务器添加 SSL 支持
- openstack - 无法使用 Python OpenStack SDK 登录到 OpenStack
- php - 在一个查询中用不同的值更新每组行
- python - 按列分组,然后根据条件过滤
- c# - 实时绘制VTK点
- c# - 如何创建具有图形或直方图进度的副本
- express - AMQP 和 Express,设置标头错误
- r - 重新排序来自 knitr 的输出