2015-06-26 3 views
0

Начинающий вопрос: Я работал над учебником Try Meteor. У меня есть поля в моем HTML-документе, поддерживаемые вспомогательными функциями, которые ссылаются на коллекции, и BOOM -> поля обновляются, когда данные изменяются в БД.В Метеор, где я смогу моделировать свои бизнес-правила?

С помощью флажка «Скрыть завершен» я также видел привязку данных к переменной сеанса. Состояние флажка хранится в объекте Session обработчиком события, а BOOM -> автоматически обновляется представление списка его помощником при изменении этого значения. Кажется немного странным назначать объект сеанса в одностраничном приложении.

Через все это мой js ничего не назначает в глобальной области видимости, я не создал никаких объектов, и я в основном видел только код конвейера, получая значения из одного места в другое. Маленькая условная логика распыляется там, где она нужна.

ВОПРОС ... Теперь я хочу построить модель своих бизнес-данных в javascript, моделировать свои бизнес-правила, а затем привязать html-поля к этой модели. Например, я хочу смоделировать пользователя, предоставив ему свойство isVeryBusy и правило, которое устанавливает isVeryBusy = true, если noTasks> 5. Я хочу, чтобы свойство и правило были изолированы в «чистом» бизнес-объекте, вдали от помощников , события и объект пользователя метеора. Я хочу, чтобы эти бизнес-объекты были доступны повсюду, поэтому я мог бы сделать ограничение, скажем, не назначать задачи для пользователей, которые очень заняты, навязаны на сервере. Мне также может потребоваться, чтобы правило отображения отображало только первые 100 символов задач других людей, если пользователь isVeryBusy. Где подходящее место для создания этого пользовательского объекта и как мне привязываться к нему из моего HTML?

+1

Фактически, 'Session' является глобальным реактивным словарем.Ваш вопрос очень широк, хорошие ответы будут очень длинными (объяснение того, как добавлять поля к объекту пользователя, как их публиковать, просматривать/редактировать, реагировать на них в вызовах методов, ограничивать возможности пользователей с помощью этих методов, ...). Пожалуйста, сушите свой вопрос до одной, четкой, идентифицируемой проблемы. Например, первая проблема в вашем вопросе несколько «Как добавить ограничения на обновления профиля пользователя»? для «очень занятого» ограничения. Вы также можете спросить, как автоматически публиковать поле «isVeryBusy» через агрегацию. –

+0

Мне не хватало места в моем предыдущем комментарии. Вот некоторые ссылки обо всем этом: [Session] (http://docs.meteor.com/#/full/session), [реактивные переменные] (http://docs.meteor.com/#/full/reactivevar_pkg) , [Mongo aggregations] (http://docs.mongodb.org/manual/reference/operator/aggregation/). Когда у вас много вопросов, часто лучше начинать делать вещи самостоятельно или, по крайней мере, спрашивать их один или два за раз. О, а также это своего рода стена с текстом. Горизонтальные линии и пространства помогают в этом отношении. –

+0

Извините, я позволил себе немного поехать. Я закрепил вопрос, и теперь я посмотрю на связанную информацию. Я удивлен, узнав, что мне может понадобиться плагин manuel: viewmodel для привязки к переменным? – bbsimonbb

ответ

1

Вы можете (и, вероятно, должны) использовать любой пакет, который позволяет прикрепить схему к вашим моделям. Посмотрите: https://github.com/aldeed/meteor-collection2 https://github.com/aldeed/meteor-simple-schema

с помощью схемы, можно определить поля, которые рассчитываются на основе других полей, смотрите свойство Автозначение: https://github.com/aldeed/meteor-collection2#autovalue

Затем вы можете сделать что-то вроде этого:

// Schema definition of User 
{ 
    ..., 
    isVeryBusy: { 
    type: Boolean, 
    autoValue: function() { 
     return this.tasks.length > 5; 
    } 
    }, 
    ... 
} 

Для всех ваших основных вопросов я настоятельно рекомендую прочитать книгу DiscoverMeteor (https://www.discovermeteor.com/). Вы можете прочитать его примерно через 1-2 дня, и он объяснит все эти основные вопросы по-настоящему понятным образом.

С наилучшими пожеланиями,

0

Существует очень хороший пакет для реализации решения, который вы ищете. Он создан Дэвидом Берлсом, и это называется «метеор-сборник-помощник». Вот его atmosphere link:

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

// Define the collections 
Clients = new Mongo.Collection('clients'); 
Tasks = new Mongo.Collection('tasks'); 

// Define the Clients collection helpers 
Clients.helpers({ 
    isVeryBusy: function(){ 
    return this.tasks.length > 5; 
    } 
}); 

// Now we can call it either on the client or on the server 
if (Meteor.isClient){ 
    var client = Clients.findOne({_id: 123}); 
    if (client.isVeryBusy()) runSomeCode(); 
} 

// Of course you can use them inside a Meteor Method. 
Meteor.methods({ 
    addTaskToClient: function(id, task){ 
    var client = Clients.findOne({_id: id}); 
    if (!client.isVeryBusy()){ 
     task._client = id; 
     Tasks.insert(task, function(err, _id){ 
     Clients.update({_id: client._id}, { $addToSet: { tasks: _id } }); 
     }); 
    } 
    } 
}); 

// You can also refer to other collections inside the helpers 
Tasks.helpers({ 
    client: function(){ 
    return Clients.findOne({_id: this._client}); 
    } 
}); 

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

Надеюсь, это поможет.

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