驱动实时 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" 标题下。