Могу ли я поместить CollaborativeString внутри пользовательского типа?

#javascript #google-drive-realtime-api

#javascript #google-drive-realtime-api

Вопрос:

Я читаю документацию Google Drive Realtime API по созданию совместной модели данных.

Мне действительно нравится, как gapi.drive.realtime.databinding.bindString ведет себя. Это не испортит ваше размещение курсора, когда несколько человек вводят текст в одно и то же текстовое поле. Но для этого требуется, чтобы вы передали ему CollaborativeString .

Но если вы регистрируете пользовательский тип, вам придется использовать gapi.drive.realtime.custom.collaborativeField независимо от того, какой тип поля вы определяете, и вы не можете передать ни одно из них bindString . На самом деле, тип collaborativeField, похоже, нигде не задокументирован, и проверка его в консоли показывает, что у него нет методов. Это означает, что нет метода registerReference, который CollaborativeString использует для отслеживания позиций курсора.

Как неприятно. Так что, я думаю, мне нужно обойти это. Я вижу несколько вариантов:

  1. Игнорируйте тот факт, что курсор запутывается во время совместной работы
  2. Используйте CollaborativeMap вместо пользовательского типа и оберните его моим пользовательским типом во время выполнения

Вероятно, собираюсь сделать вариант 2.

Комментарии:

1. Это должно быть возможно .. можете ли вы точно показать, что вы делаете, и конкретное сообщение об ошибке?

2. Если это возможно, покажите мне, как это сделать. Это кажется невозможным.

Ответ №1:

Я думаю, вы неправильно понимаете, как работает этот сайт, ответственность не лежит на других людях, чтобы показать вам, как что-то сделать — вы просите других людей уделить время своему дню и помочь вам.

При этом быстрый просмотр страницы, на которую вы ссылались, показывает, что то, что вы хотите сделать, не только возможно, но и довольно просто и совместимо с bindString . Кража из примера кода с этой страницы:

 // Call this function before calling gapi.drive.realtime.load
function registerCustomTypes()
{
    var Book = function () { };

    function initializeBook()
    {
        var model = gapi.drive.realtime.custom.getModel(this);

        this.reviews = model.createList();
        this.content = model.createString();
    }

    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');
    Book.prototype.content = gapi.drive.realtime.custom.collaborativeField('content');

    gapi.drive.realtime.custom.setInitializer(Book, initializeBook);
}
  

и

 // Pass this as the 2nd param to your gapi.drive.realtime.load call
function onDocLoaded(doc)
{
    var docModel = doc.getModel();
    var docRoot = docModel.getRoot();

    setTimeout(function ()
    {
        var book = docModel.create('Book');

        book.title = 'Moby Dick';
        book.author = 'Melville, Herman';
        book.isbn = '978-1470178192';
        book.isCheckedOut = false;

        book.content.setText("Call me Ishmael. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world.");

        docRoot.set('tbook', book);

        debugger;
    }, 0);
}
  

Удачи и получайте удовольствие от Realtime API — с ним очень весело играть.

Комментарии:

1. Где вы нашли этот пример кода? Я не вижу его на странице, на которую я ссылался.

2. Привет, Ник — он размещен на странице в разделах «Регистрация и создание пользовательских объектов» и «Инициализатор». Приведенный ими пример кода не использует CollaborativeString, а вместо этого использует CollaborativeList .

3. Этот пример кажется странным. Сначала может показаться, что вы загромождаете свойство collaborativeField, помещая над ним CollaborativeString . Я думаю, это улучшает его? Интересно, почему они сделали эту систему такой странной, что вам приходится забивать свои поля при инициализации, вместо того, чтобы изначально объявлять их как типы, которыми они должны быть…

4. О, теперь я это вижу. ОК. Ну, я думаю, если это так, как мы должны это делать. Спасибо =]

5. Для справки, я вообще не нахожу это простым, и я полностью ожидал, что это будет невозможно сделать: P. Я уже работал над этим в своем коде, но знание этого поможет мне немного упростить ситуацию.

Ответ №2:

Я знаю, что этот вопрос и ответ устарели, но для справки, только последняя часть очень хорошего ответа Гранта Уоттерса, процедура onDocLoaded, довольно вводит в заблуждение. Эта функция, как написано, больше подходит для 3-го параметра в gapi.drive.realtime.вызов load, обратный вызов onInitializeModel .

2-й параметр вызывается каждый раз при загрузке документа. Обычно вы не стали бы добавлять один и тот же объект снова и снова, как это было бы в приведенной выше процедуре… Вместо этого вы обычно настраиваете обработку событий, привязки данных и т. Д. Эта версия может несколько прояснить:

 // Pass this as the 2nd param to your gapi.drive.realtime.load call
function onDocLoaded(doc)
{
    var docModel = doc.getModel();
    var docRoot = docModel.getRoot();
    var text = doc.getModel().getRoot().get("text");

    // Add an event listener...
    text.addEventListener(gapi.drive.realtime.EventType.TEXT_INSERTED, onStringChanged);

    // ...and/or bind to collaborative objects:
    var textArea = document.getElementById('textArea1')
    textBinding = gapi.drive.realtime.databinding.bindString(text, textArea);

    etc...
}
  

Не случайно, bindString возвращает объект привязки, который необходим для «unbind» позже, предотвращая ошибку AlreadyBound или другое неожиданное поведение при загрузке следующего документа. Сделайте что-то вроде этого:

 function onDocLoaded(doc)
{
    // Clear any previous bindings etc:
    if (textBinding) { textBinding.unbind() };
    textBinding = null;

    etc...