2013-09-13 2 views
7

В Meteor у меня есть коллекция, на которую клиент подписывается. В некоторых случаях вместо публикации документов, которые существуют в коллекции на сервере, я хочу отправить некоторые фиктивные данные. Теперь это нормально, используя функцию this.added в публикации.Обновить документ в Meteor mini-mongo без обновления серверных коллекций

Моя проблема в том, что я хочу рассматривать фиктивный документ так, как если бы это был реальный документ, особенно это становится проблематичным, когда я хочу его обновить. Для реальных документов я запускаю RealDocs.update, но при выполнении этого действия в фиктивном документе он не работает, поскольку на сервере нет его представления (и я хотел бы сохранить его таким образом).

API-интерфейс коллекции, который позволил мне передать что-то вроде local = true, было бы фантастическим, но я понятия не имею, как сложно это реализовать, и я не хочу изменять основной код.

В настоящее время я застрял в создании BogusDocs = new Meteor.Collection(null), но это затрудняет заполнение коллекции, поскольку я должен либо установить жесткий код в код клиента, либо использовать метод для получения данных с сервера, и мне нужно убедитесь, что я звоню BogusDocs.update вместо RealDocs.update, как только я имею дело с фиктивными данными.

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

Любые мысли о том, как подойти к этой проблеме?

ответ

17

После некоторого дальнейшего исследования (the evented mind site), то получается, что один может изменить локальную коллекцию без вызовов на сервер. Это делается путем запуска тех же методов, что и вы, но на MyCollection._collection, а не только на коллекции. MyCollection.update() таким образом станет MyCollection._collection.update(). Таким образом, используя простую оболочку, вы можете передать обычные аргументы при вызове обновления, чтобы обновить коллекцию как обычно (что будет пытаться вызвать сервер, который, в свою очередь, вызовет ваши правила allow/deny), или мы можем добавить 'local' в качестве последнего аргумент, чтобы выполнять обновление только в клиентской коллекции. Что-то вроде этого должно это сделать.

DocsUpdateWrapper = function() { 
    var lastIndex = arguments.length -1; 
    if (arguments[lastIndex] === 'local') { 
    Docs._collection.update(arguments.slice(0, lastIndex); 
    } else { 
    Docs.update(arguments) 
    } 
} 

(Это, конечно, может быть расширен до DocsWrapper, что позволяет для вставки и удаления тоже.) (Didnt попробовать эту функцию еще, но она должна служить также в качестве примера.)

Самым большим преимуществом это означает, что мы можем использовать одни и те же вызовы для извлечения документов из локальной коллекции независимо от того, являются ли они локальными или живут на сервере.Добавляя простой логический документ, мы можем отслеживать, какие документы являются только локальными, а какие нет (улучшенный DocsWrapper может проверить этот bool, чтобы мы могли даже опустить передачу «локального» аргумента.), Поэтому мы знаем, как обновлять их.

+0

Я действительно [сообщил об этом как об ошибке] (https://github.com/meteor/meteor/issues/3271), но может быть (un) предназначенной функцией. –

0

Есть некоторые люди, работающие с локальным хранилищем в браузере https://github.com/awwx/meteor-browser-store Возможно, вы сможете адаптировать некоторые свои идеи для обеспечения «поддельных» документов.

0

Я бы использовал функцию преобразования в коллекции, чтобы создать объект, который знает, что делать с собой (на клиенте). Дайте ему метод обновления корня (реальный/фиктивный), а затем вызовите .update, а не общий.

Вы можете поместить код из этого. В процесс преобразования.

0

Вы также можете создать локальную коллекцию minimongo. Вставьте на обратный вызов

@FoundAgents = new Meteor.Collection(null, Agent.transformData) 

    FoundAgents.remove({}) 
    Meteor.call 'Get_agentsCloseToOffer', me, ping, (err, data) -> 
    if err 
     console.log JSON.stringify err,null,2 
    else 
     _.each data, (item) -> 
     FoundAgents.insert item 
0

Возможно, это интересно и для вас, я создал два примера с местными метеоритами местных коллекций на метеораде. На первой панели показан пример с простым реактивным набором записей: Sample_Publish_to_Local-Collection. Второй будет использовать метод сбора данных .observe для прослушивания данных: Collection.observe().

Смежные вопросы