Циклическая ошибка JSON Google Realtime, когда indexReference сохраняется в совместной карте только тогда, когда содержится в объекте

Пытаясь сохранить indexReferences для каждого пользователя, я обнаружил, что когда я сохраняю один (или несколько) непосредственно на карте, он работает нормально. Однако при сохранении в объекте (или пользовательском объекте реального времени) API реального времени генерирует ошибки Circular JSON.

Это отлично работает:

function doRegisterTypes() {
    gapi.drive.realtime.custom.registerType(MyCustomType, "MyCustomType");
    MyCustomType.prototype.startPoints = gapi.drive.realtime.custom.collaborativeField('startPoints');
    MyCustomType.prototype.endPoints = gapi.drive.realtime.custom.collaborativeField('endPoints');
    MyCustomType.prototype.elements = gapi.drive.realtime.custom.collaborativeField('elements');

    gapi.drive.realtime.custom.setInitializer(MyCustomType, initializeMyCustomType);
}

function initializeMyCustomType() {
    var model = gapi.drive.realtime.custom.getModel(this);
    this.startPoints = model.createMap();
    this.endPoints = model.createMap();
    this.elements = model.createList();
}

function initializeModel(model) {
    var o = model.create("MyCustomType");
    o.elements.pushAll(["foo", "bar"]);
    var startIndex = o.elements.registerReference(0, false);
    var endIndex = o.elements.registerReference(0, false);
    o.startPoints.set(UserId, startIndex);
    o.endPoints.set(UserId, endIndex);

    model.getRoot().set("MyCustomObject", o);
}

Но это не так, сбой с циклическими ошибками JSON при сохранении объекта диапазона на карте:

function doRegisterTypes() {
    gapi.drive.realtime.custom.registerType(MyCustomType, "MyCustomType");
    MyCustomType.prototype.ranges = gapi.drive.realtime.custom.collaborativeField('ranges');
    MyCustomType.prototype.elements = gapi.drive.realtime.custom.collaborativeField('elements');

    gapi.drive.realtime.custom.setInitializer(MyCustomType, initializeMyCustomType);
}

function initializeMyCustomType() {
    var model = gapi.drive.realtime.custom.getModel(this);
    this.ranges = model.createMap();
    this.elements = model.createList();
}

function initializeModel(model) {
    var o = model.create("MyCustomType");
    o.elements.pushAll(["foo", "bar"]);
    var startIndex = o.elements.registerReference(0, false);
    var endIndex = o.elements.registerReference(0, false);

    // FAILS:
    o.ranges.set(UserId, {start:startIndex, end:endIndex});

    model.getRoot().set("MyCustomObject", o);
}

Я должен подчеркнуть, что ошибка появляется для одного indexReference, и независимо от того, является ли объект определенным пользовательским типом или нет, а также КОГДА значение устанавливается в карту: при инициализации модели или позже. Как будто indexReferences нельзя хранить ни на чем, кроме «верхнего уровня», хотя в этом мало смысла.

Характерная черта? Ошибка? Тупость пользователя?


person HeyHeyJC    schedule 13.02.2015    source источник
comment
Можете ли вы опубликовать точное сообщение об ошибке? что такое o.ranges?   -  person Cheryl Simon    schedule 13.02.2015
comment
@ Cheryl Simon Я дам вам сообщение об ошибке, но o.ranges - это карта, установленная во втором примере подпрограммы initializeMyCustomType.   -  person HeyHeyJC    schedule 13.02.2015
comment
@CherylSimon Вот ошибка: Ошибка в функции слушателя: TypeError: Преобразование циклической структуры в JSON TypeError: Преобразование циклической структуры в JSON в Object.stringify (собственный) ... плюс еще куча всего.   -  person HeyHeyJC    schedule 13.02.2015


Ответы (1)


Вы не можете хранить CollaborativeObjects в произвольном json внутри CollaborativeObject. CollaborativeObjects (включая IndexReferences) должны храниться непосредственно в других CollaborativeObjects.

(Для этого есть несколько причин, в основном связанных с тем, как работает совместная работа. Объекты json обрабатываются как произвольные большие двоичные объекты, содержимое которых игнорируется.)

В этом случае вы можете создать настраиваемый тип объекта Range с начальным и конечным полем CollaborativeField. (Или CollaborativeList с 2 элементами..)

person Cheryl Simon    schedule 13.02.2015
comment
Как я уже сказал в исходном вопросе, это происходит, даже когда я создаю пользовательский объект, в данном случае объект Range с началом и концом... - person HeyHeyJC; 13.02.2015
comment
О, извините, я пропустил это... это, вероятно, ошибка. У вас есть ссылка на репро-страницу? Мы рассмотрим это. Между тем, CollabList из 2 элементов должен работать :-/ - person Cheryl Simon; 14.02.2015
comment
Хорошо, я исправил это... вы были правы, но есть еще кое-что: в процедуре инициализации для пользовательского типа Range я устанавливал начало и конец на ноль (не работает) или на {} (не работал). Возможно, это моя глупость, но в этот момент нет необходимости устанавливать для них что-либо или вообще инициализировать тип. - person HeyHeyJC; 14.02.2015
comment
А, хорошо, рад, что ты это понял! - person Cheryl Simon; 14.02.2015
comment
Не знаю, можно ли это считать ошибкой, но как только они вообще установлены, установка их в indexReference приводит к фолу. - person HeyHeyJC; 14.02.2015
comment
Да, это, вероятно, не должно взорваться. Я зарегистрирую ошибку. - person Cheryl Simon; 14.02.2015