环回:嵌入式模型在离线同步中不工作
Loopback: Embedded Model is not working in offline sync
我按照 loopback offline sync 示例创建了我自己的嵌入文档模型。
我创建了一个名为 Project 的模型,其中 ProjectMembers 是嵌入式模型。这是我的模型:
Project.json
{
"name": "Project",
"base": "PersistedModel",
"strict": "throw",
"persistUndefinedAsNull": true,
"trackChanges": true,
"properties": {
...
},
"relations": {
"members": {
"type": "embedsMany",
"model": "ProjectMember",
"property": "members",
"options": {
"validate": true,
"forceId": false
}
}
}
}
ProjectMember.json
{
"name": "ProjectMember",
"base": "Model",
"idInjection": true,
"properties": {
...
},
"validations": [],
"relations": {},
"acls": [],
"methods": []
}
在服务器端模型中-config.json 我更新了数据源如下:
"Project": {
"dataSource": "my_db"
},
"ProjectMember": {
"dataSource": "transient"
}
并且在 lbclient/models/ 的客户端我添加了 2 个文件 local-project.json 和 remote-project.json 与 local-todo.json 和 remote- 完全相同todo.json。
我更新了客户端模型-config.json 文件如下:
"RemoteProject": {
"dataSource": "remote"
},
"LocalProject": {
"dataSource": "local"
}
在客户端控制器中我运行以下代码:
ProjectModel.create($scope.project)
.then(function(project) {
var owner = loginDetails.getLoginUser();// the member
owner.role = 'owner';
owner.status = 'active';
project.members.create(owner); //shows error: couldn't read property
$scope.project = {};
$scope.$apply();
});
创建项目但未能创建嵌入式模型。它显示 "Couldn't read property create undefined"?有没有办法在客户端创建嵌入式模型?
更新
嵌入式模型仅适用于服务器端。但是当 browserify 创建 browse.bundle.js 时,它无法添加嵌入式模型。
我按照反复试验的方法,得出了一个关于离线嵌入式模型的解决方案。
和之前一样,我只在"common/models/"目录下定义了Project和ProjectMember的关系。我发现,我也必须在客户端模型中定义关系。所以我做了以下步骤并且它起作用了。
我创建了一个 json 文件 - "lbclient/models/local-project-member.json"。
{
"name": "LocalProjectMember",
"base": "ProjectMember"
}
在 "lbclient/model-config.json" 中添加了以下行。
"LocalProjectMember":{
"dataSource": "local"
}
修改了 "lbclient/models/local-project.json" 文件如下。
{
"name": "LocalProject",
"base": "Project",
"relations":{
"members": {
"type": "embedsMany",
"model": "LocalProjectMember",
"property": "memberList",
"options": {
"persist": true,
"validate": true,
"forceId": false
}
}
}
}
所以结论是,如果您希望嵌入式模型离线工作,您必须重新定义客户端模型中的关系。
我按照 loopback offline sync 示例创建了我自己的嵌入文档模型。
我创建了一个名为 Project 的模型,其中 ProjectMembers 是嵌入式模型。这是我的模型:
Project.json
{
"name": "Project",
"base": "PersistedModel",
"strict": "throw",
"persistUndefinedAsNull": true,
"trackChanges": true,
"properties": {
...
},
"relations": {
"members": {
"type": "embedsMany",
"model": "ProjectMember",
"property": "members",
"options": {
"validate": true,
"forceId": false
}
}
}
}
ProjectMember.json
{
"name": "ProjectMember",
"base": "Model",
"idInjection": true,
"properties": {
...
},
"validations": [],
"relations": {},
"acls": [],
"methods": []
}
在服务器端模型中-config.json 我更新了数据源如下:
"Project": {
"dataSource": "my_db"
},
"ProjectMember": {
"dataSource": "transient"
}
并且在 lbclient/models/ 的客户端我添加了 2 个文件 local-project.json 和 remote-project.json 与 local-todo.json 和 remote- 完全相同todo.json。 我更新了客户端模型-config.json 文件如下:
"RemoteProject": {
"dataSource": "remote"
},
"LocalProject": {
"dataSource": "local"
}
在客户端控制器中我运行以下代码:
ProjectModel.create($scope.project)
.then(function(project) {
var owner = loginDetails.getLoginUser();// the member
owner.role = 'owner';
owner.status = 'active';
project.members.create(owner); //shows error: couldn't read property
$scope.project = {};
$scope.$apply();
});
创建项目但未能创建嵌入式模型。它显示 "Couldn't read property create undefined"?有没有办法在客户端创建嵌入式模型?
更新
嵌入式模型仅适用于服务器端。但是当 browserify 创建 browse.bundle.js 时,它无法添加嵌入式模型。
我按照反复试验的方法,得出了一个关于离线嵌入式模型的解决方案。 和之前一样,我只在"common/models/"目录下定义了Project和ProjectMember的关系。我发现,我也必须在客户端模型中定义关系。所以我做了以下步骤并且它起作用了。
我创建了一个 json 文件 - "lbclient/models/local-project-member.json"。
{ "name": "LocalProjectMember", "base": "ProjectMember" }
在 "lbclient/model-config.json" 中添加了以下行。
"LocalProjectMember":{ "dataSource": "local" }
修改了 "lbclient/models/local-project.json" 文件如下。
{ "name": "LocalProject", "base": "Project", "relations":{ "members": { "type": "embedsMany", "model": "LocalProjectMember", "property": "memberList", "options": { "persist": true, "validate": true, "forceId": false } } } }
所以结论是,如果您希望嵌入式模型离线工作,您必须重新定义客户端模型中的关系。