驱动实时 api 模型 toJson 不填充自定义类型中的字段
drive realtime api model toJson not populating fields in custom type
我正在使用自定义类型构建一个 Drive Realtime 项目:https://developers.google.com/google-apps/realtime/custom-objects。
我遇到一个问题,我的自定义对象中的字段未导出到 model.toJson() 输出中。我确定我只是遗漏了一些东西,但我没能发现我构建自定义对象的方式与实时游乐场或实时 API 文档有任何区别。
下面是使用实时 playground 的示例重现案例。
1) 转到实时游乐场:https://realtimeplayground.appspot.com/
2)打开开发者控制台
3)运行下面的代码
test = function () {}
test.prototype = { init: function() { this.name = 'testName';}};
test.prototype.name = gapi.drive.realtime.custom.collaborativeField('name');
gapi.drive.realtime.custom.registerType(test, 'testType')
gapi.drive.realtime.custom.setInitializer(test, test.prototype.init);
var model = window.doc.getModel()
model.getRoot().set('myTest', model.create(test));
model.toJson()
观察到的输出:
"{"id":"root","type":"Map","value":
{"demo_string":
{"id":"Tq50c9iybcXi","type":"EditableString","value":"Edit Me!"},
"demo_list":{"id":"ZmjclOeUbcXj","type":"List","value":
[{"json":"Cat"},{"json":"Dog"},{"json":"Sheep"},{"json":"Chicken"}]},
"demo_cursors":{"id":"6TJ6Zzd2bcXj","type":"Map","value":{}},
"demo_map":{"id":"ukRRMPHbbcXj","type":"Map","value":
{"key1":{"json":"value 1"},"key2":{"json":"value 2"},"key3":{"json":"value 3"}}},
"demo_custom":{"id":"44nsuMAPbcXk","type":"DemoMovie","value":
{"name":{"json":"Minority Report"},
"director":{"json":"Steven Spielberg"},
"notes":{"json":""},"rating":{"json":""}}},
"myTest":{"id":"Kq4hcV4UbcvW","type":"testType","value":{}}}}"
预计:
"{"id":"root","type":"Map","value":
{"demo_string":
{"id":"Tq50c9iybcXi","type":"EditableString","value":"Edit Me!"},
"demo_list":{"id":"ZmjclOeUbcXj","type":"List","value":
[{"json":"Cat"},{"json":"Dog"},{"json":"Sheep"},{"json":"Chicken"}]},
"demo_cursors":{"id":"6TJ6Zzd2bcXj","type":"Map","value":{}},
"demo_map":{"id":"ukRRMPHbbcXj","type":"Map","value":
{"key1":{"json":"value 1"},"key2":{"json":"value 2"},"key3":{"json":"value 3"}}},
"demo_custom":{"id":"44nsuMAPbcXk","type":"DemoMovie","value":
{"name":{"json":"Minority Report"},
"director":{"json":"Steven Spielberg"},
"notes":{"json":""},"rating":{"json":""}}},
"myTest":{"id":"Kq4hcV4UbcvW","type":"testType","value":{"json":"testName"}}}}}"
注册自定义类型只能发生在文档生命周期的“Pre-Load”阶段。您的代码是正确的,但在文档加载后 上执行。这会导致自定义 object 无法正确构建,这就是为什么它缺少您在 init 函数中指定的 JSON 值的原因。
要查看正确的流程,请在 Realtime Playground 应用程序的 static/elements/playground-app.js 的第 88 行放置一个断点。刷新页面,当执行暂停时,运行 来自控制台的代码:
test = function () {}
test.prototype = { init: function() { this.name = 'testName';}};
test.prototype.name = gapi.drive.realtime.custom.collaborativeField('name');
gapi.drive.realtime.custom.registerType(test, 'testType')
gapi.drive.realtime.custom.setInitializer(test, test.prototype.init);
恢复执行。应用程序完全加载后,运行 其余代码:
var model = window.doc.getModel()
model.getRoot().set('myTest', model.create(test));
model.toJson()
您会看到输出的 JSON 符合您的预期:
"myTest":{"id":"1OiQd2QoEqBs","type":"testType","value":{"name":{"json":"testName"}}}
此工作流程记录在 Custom Collaborative Objects 指南的 "Registering custom types and fields" 标题下。
我正在使用自定义类型构建一个 Drive Realtime 项目:https://developers.google.com/google-apps/realtime/custom-objects。
我遇到一个问题,我的自定义对象中的字段未导出到 model.toJson() 输出中。我确定我只是遗漏了一些东西,但我没能发现我构建自定义对象的方式与实时游乐场或实时 API 文档有任何区别。
下面是使用实时 playground 的示例重现案例。
1) 转到实时游乐场:https://realtimeplayground.appspot.com/ 2)打开开发者控制台 3)运行下面的代码
test = function () {}
test.prototype = { init: function() { this.name = 'testName';}};
test.prototype.name = gapi.drive.realtime.custom.collaborativeField('name');
gapi.drive.realtime.custom.registerType(test, 'testType')
gapi.drive.realtime.custom.setInitializer(test, test.prototype.init);
var model = window.doc.getModel()
model.getRoot().set('myTest', model.create(test));
model.toJson()
观察到的输出:
"{"id":"root","type":"Map","value":
{"demo_string":
{"id":"Tq50c9iybcXi","type":"EditableString","value":"Edit Me!"},
"demo_list":{"id":"ZmjclOeUbcXj","type":"List","value":
[{"json":"Cat"},{"json":"Dog"},{"json":"Sheep"},{"json":"Chicken"}]},
"demo_cursors":{"id":"6TJ6Zzd2bcXj","type":"Map","value":{}},
"demo_map":{"id":"ukRRMPHbbcXj","type":"Map","value":
{"key1":{"json":"value 1"},"key2":{"json":"value 2"},"key3":{"json":"value 3"}}},
"demo_custom":{"id":"44nsuMAPbcXk","type":"DemoMovie","value":
{"name":{"json":"Minority Report"},
"director":{"json":"Steven Spielberg"},
"notes":{"json":""},"rating":{"json":""}}},
"myTest":{"id":"Kq4hcV4UbcvW","type":"testType","value":{}}}}"
预计:
"{"id":"root","type":"Map","value":
{"demo_string":
{"id":"Tq50c9iybcXi","type":"EditableString","value":"Edit Me!"},
"demo_list":{"id":"ZmjclOeUbcXj","type":"List","value":
[{"json":"Cat"},{"json":"Dog"},{"json":"Sheep"},{"json":"Chicken"}]},
"demo_cursors":{"id":"6TJ6Zzd2bcXj","type":"Map","value":{}},
"demo_map":{"id":"ukRRMPHbbcXj","type":"Map","value":
{"key1":{"json":"value 1"},"key2":{"json":"value 2"},"key3":{"json":"value 3"}}},
"demo_custom":{"id":"44nsuMAPbcXk","type":"DemoMovie","value":
{"name":{"json":"Minority Report"},
"director":{"json":"Steven Spielberg"},
"notes":{"json":""},"rating":{"json":""}}},
"myTest":{"id":"Kq4hcV4UbcvW","type":"testType","value":{"json":"testName"}}}}}"
注册自定义类型只能发生在文档生命周期的“Pre-Load”阶段。您的代码是正确的,但在文档加载后 上执行。这会导致自定义 object 无法正确构建,这就是为什么它缺少您在 init 函数中指定的 JSON 值的原因。
要查看正确的流程,请在 Realtime Playground 应用程序的 static/elements/playground-app.js 的第 88 行放置一个断点。刷新页面,当执行暂停时,运行 来自控制台的代码:
test = function () {}
test.prototype = { init: function() { this.name = 'testName';}};
test.prototype.name = gapi.drive.realtime.custom.collaborativeField('name');
gapi.drive.realtime.custom.registerType(test, 'testType')
gapi.drive.realtime.custom.setInitializer(test, test.prototype.init);
恢复执行。应用程序完全加载后,运行 其余代码:
var model = window.doc.getModel()
model.getRoot().set('myTest', model.create(test));
model.toJson()
您会看到输出的 JSON 符合您的预期:
"myTest":{"id":"1OiQd2QoEqBs","type":"testType","value":{"name":{"json":"testName"}}}
此工作流程记录在 Custom Collaborative Objects 指南的 "Registering custom types and fields" 标题下。