I have tried to follow the step described at Build a Collaborative Data Model and I end up with the following code :

function onLoad(doc){
  var Book = function(){};

  var model = doc.getModel();
  gapi.drive.realtime.custom.registerType(Book, 'Book');
  Book.prototype.title = gapi.drive.realtime.custom.collaborativeField('title');
  Book.prototype.author = gapi.drive.realtime.custom.collaborativeField('author');
  Book.prototype.isbn = gapi.drive.realtime.custom.collaborativeField('isbn');
  Book.prototype.isCheckedOut = gapi.drive.realtime.custom.collaborativeField('isCheckedOut');
  Book.prototype.reviews = gapi.drive.realtime.custom.collaborativeField('reviews');
  var book = model.create('Book');
  model.getRoot().set('book', book);
  book.addEventListener(gapi.drive.realtime.EventType.OBJECT_CHANGED, function(e){console.log(e);});
  book.title = 'Moby Dick';
  book.author = 'Melville, Herman';
  book.isbn = '978-1470178192';
  book.isCheckedOut = false;
}

Unfortunately when executing this I get the following error when var book = model.create('Book'); is executed :

Uncaught java.lang.IllegalArgumentException: Unknown type name Book

Drive Realtime API Error: invalid_compound_operation: Open compound operation at end of synchronous block - did you forget to call endCompoundOperation()?

What do I miss ?

有帮助吗?

解决方案

You need to register the custom type before you load the document.

There are three different sections you want here:

  • Before you load: register the custom type.
  • On init: This happens exactly once per document. Here you want to be initializing the data model that every doc should have.
  • On file loaded: This happens once per load. This is where you want to be setting up event listeners, etc.

Split your function into those three parts, and it should work.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top