Общий вопрос: в Meteor, какой лучший способ реализовать бизнес-логику, которая запускается всякий раз, когда модель обновляется - например, для обновления зависимых полей или валидации или...
Конкретный пример: я хотел бы добавить поле "slug" в коллекцию списков в примере Meteor todos. Пул должен автоматически обновляться при каждом изменении имени списка.
Вот что у меня есть... Я наблюдаю за каждым изменением в списке, чтобы увидеть, нужно ли его создавать или обновлять его. Это находится в shared models.js(выполняется сервер и клиентская сторона, чтобы получить преимущества компенсации задержки):
// Lists -- {name: String}
Lists = new Meteor.Collection("lists");
var listsObserver = Lists.find().observe({
added: updateSlug,
changed: updateSlug
});
function updateSlug(doc, idx) {
var slug = (doc.name || '').replace(/\W+/g, '-').toLowerCase();
if (slug !== doc.slug) {
console.log("Updating slug for '" + doc.name + "' to " + slug);
Lists.update(doc._id, {$set: {slug: slug}});
}
}
(И как в исходном примере todos, server/publish.js публикует все Lists.find()
как "списки", а client/todos.js подписывается на эту коллекцию.)
Вышеприведенный код, похоже, работает, но как-то не подходит мне. Вопросы:
- Наблюдает ли коллекция списков, как это, разумный подход? Кажется, что это может быть неэффективным - любое изменение в документе "Списки" инициирует этот код.
- Должен ли я делать другую (смоделированную) клиентскую версию обновления, или это нормально, чтобы позволить это же обновление Mongo/Minimongo работает на обоих?
- Нужно ли мне называть
listsObserver.stop()
в какой-то момент, чтобы распоряжаться наблюдателем? И если да, то когда?
(Я только начинаю работать с Meteor, поэтому, возможно, мои пристрастия к другим средам протекают. Подразумеваемый мета-вопрос здесь, я даже думаю об этой проблеме правильно?)