2016-01-26 2 views
0

У меня есть элемент интерфейса элемента UI, который работает только с определенной моделью данных (ожидает объект с ключом «текст»). Это отличается от модели данных, которая существует в моем mongodb. Итак, моя первая идея заключалась в том, чтобы использовать проекцию и публиковать ее слушателям.Использовать проекцию для публикации метеоритов подписаться

var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db; db.Element.aggregate({$project: { _id:1, text:"$description"}});

Проблема в том, что это не курсор, а только простой объект ejson. Какую стратегию я должен использовать, чтобы предоставить необходимые данные для интерфейса пользовательского интерфейса и иметь привязку реактивности/данных с обеих сторон.

+0

Как быстро устранить проблему я использую Meteor.map и _.extend, чтобы добавить поле в фильме курсора, но это на самом деле не реактивная – Sonne

+0

Есть несколько пакетов для этого, как reywood: publish- составная или peerlibrary: реактивно-публиковать – MrE

ответ

1

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

Например, когда вы возвращаете курсор из публикации, Метеор вызывает функцию _publishCursor, которая выглядит следующим образом:

Mongo.Collection._publishCursor = function (cursor, sub, collection) { 
    var observeHandle = cursor.observeChanges({ 
    added: function (id, fields) { 
     sub.added(collection, id, fields); 
    }, 
    changed: function (id, fields) { 
     sub.changed(collection, id, fields); 
    }, 
    removed: function (id) { 
     sub.removed(collection, id); 
    } 
    }); 

    // We don't call sub.ready() here: it gets called in livedata_server, after 
    // possibly calling _publishCursor on multiple returned cursors. 

    // register stop callback (expects lambda w/ no args). 
    sub.onStop(function() {observeHandle.stop();}); 

    // return the observeHandle in case it needs to be stopped early 
    return observeHandle; 
}; 

Таким образом, вы можете изменить вашу публикацию, в основном, делают то же самое, но и опубликовать текстовое поле, которое получает свое значение из поля описания, например так:

Учитывая следующие коллекции:

Вы опубликовать п соборование может выглядеть следующим образом:

Meteor.publish("myPub", function() { 
    var sub = this; 
    var observeHandle = myCollection.find().observeChanges({ 
    added: function (id, fields) { 
     fields.text = fields.description; // assign text value here 
     sub.added("my_collection", id, fields); 
    }, 
    changed: function (id, fields) { 
     fields.text = fields.description; // assign text value here 
     sub.changed("my_collection", id, fields); 
    }, 
    removed: function (id) { 
     sub.removed("my_collection", id); 
    } 
    }); 

    sub.ready() 

    // register stop callback (expects lambda w/ no args). 
    sub.onStop(function() {observeHandle.stop();}); 

}; 

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

  • Нет связанных вопросов^_^