2015-04-15 7 views
0

Находясь в моем приложении meteor, я хотел бы сейчас как улучшить обработку данных из minimongo.Как улучшить обработку данных с помощью meteor

Используется для SQL/PHP, я хотел бы знать, как найти() объект из моей коллекции minimongo только один раз и получить доступ к каждому из его свойств с помощью помощников, без необходимости повторного доступа к коллекции каждый раз ,

До сих пор, что я сделал, было что-то вроде этого:

Template.profile.helpers({ 
    name: function(e, tmpl){ 
    return Meteor.users.FindOne({_id: Meteor.userId()}.profile.name; 
    }, 
    phone: function(e, tmpl){ 
    return Meteor.users.FindOne({_id: Meteor.userId()}.profile.phone; 
    } 

[...] });

Но это становится скучным, и я думаю, что должен быть более эффективный способ справиться с этим, что-то, где я мог бы загружать всю свою информацию о пользователе только один раз, а затем отображать с помощью помощника, принимающего один параметр, для отображения данных так: {{имя данных}}, {{данные телефона}}

С только один помощник в этом роде:

Template.profile.helpers({ 
    data: function(aString){ 
    if (aString == "phone) 
     return [...].phone; 
    } 
    } 
[...] 
}); 

конечно, я могу использовать значение сеанса, но я не уверен это так важно, как я мог.

Другое дело: как завершить сеанс Метеор? Поскольку с PHP, сеанс заканчивается при закрытии браузера, а cookie остается на заданную продолжительность, но с метеорным сеансом я никогда не должен повторно подключаться как день за днем, мои журналы, похоже, остаются.

Кто-нибудь проведет меня через это или даст мне хорошие привычки/советы? Я все еще читаю документ, но он довольно большой: S

Спасибо!

ответ

0

Отметим, что вы фактически не отправляете запрос на сервер при вызове на клиентском компьютере Mongo.Collection.find(), который обрабатывается экземпляром miniMongo на клиенте, поэтому на самом деле это неэффективно. Кроме того, в данном конкретном случае, текущий пользователь всегда доступны как Meteor.user() - нет необходимости использовать Meteor.users.find({_id: Meteor.userId()}); (см docs для получения дополнительной информации)

Однако, если вы действительно хотите кэшировать это значение, вы могли бы сделать что-то подобное :

// JS 
var data; // scoped so it's available to the whole file 

Template.profile.onCreated({ 
    data = Meteor.users.findOne({_id: Meteor.userId()}); // above scope makes this new definition available to the whole file 
}); 

Затем, чтобы выполнить то, что вы описываете с помощью строковых аргументов, вы можете сделать что-то вроде ...

Template.profile.helpers({ 
    data: function(aString) { 
     if (data) { return data[aString]; } 
    } 
}); 

Возможно, лучший вариант, даже чтобы отправить шаблон, контекст данных - что-то вроде этого в вашем HTML файле:

{{> profile currentUser}} <!-- currentUser returns Meteor.user() --> 

, который непосредственно доступен для ваших помощников, как this:

Template.profile.helpers({ 
    data: function(aString) { 
    return this[aString]; 
    } 
}); 

Вы также можете передавать контексты данных through IronRouter, если вы используете это для своей маршрутизации.

Что касается сеанса Метеор, модель отличается от модели для PHP. В PHP вы храните информацию о сеансе на сервере, и каждый раз, когда вы обращаетесь к серверу, браузер (или клиент, в более общем плане) отправляет по идентификатору сеанса, чтобы он мог искать все, что связано с вашей сессией (см. this question для потенциально лучшего объяснение). Meteor отслеживает клиентов, которые подключены к нему, поэтому сеанс останется открытым, пока ваш браузер открыт. Если вам нужно манипулировать сеансами пользователя Meteor, взгляните на this question.

+0

Спасибо вам большое! :) Ожидается, что это лучший способ сделать, даже если это небольшое улучшение. Я сделаю вот так! –

0

Я рекомендую найти пакет помощников коллекции на Атмосфере. Это позволит вам написать currentUser.name в шаблоне, и оно автоматически вернет возвращаемые функции помощника имени пользователя.

Нет проблем с этим. Не имеет значения, вызвана ли функция несколько раз. Это не повредит производительности ваших приложений.

PHP и метеорные сеансы разные. Метеоритная сессия длится до тех пор, пока окно браузера остается открытым или страница обновляется. Вы правы, что сеансы метеоритов - это не путь для решения вашей проблемы.

+0

Большое спасибо за вашу помощь и объяснения :) Тогда мне придется работать с настоящим mongodb, так как мое приложение предназначено для приема тысяч пользователей, но я пока об этом не думал. –

+0

Это тоже не проблема. Вы публикуете только конкретных пользователей для клиента. В общем, это будет только один пользователь (зарегистрированный пользователь). Клиент mini mongodb будет иметь только одного пользователя, поэтому вам не нужно ничего кэшировать. Вы никогда не должны отправлять тысячи предметов на одну страницу. –

+0

Да, но на стороне сервера, мне нужно будет использовать и установить mongodb, нет? –