Meteor App - есть ли способ создать наблюдаемые объекты
-
20-12-2019 - |
Вопрос
В моем приложении Meteor у меня есть следующий обработчик, возвращая «вкладчик» записи:
Template["IntroductionWizard_Step_1"].helpers({
contributor: function(n) {
return ContributorCollection.findOne({contributorName: ""});
}
});
.
Эта запись используется в реактивном шаблоне:
<input type="text" id="name" name="name" class="form-control-element" value="{{contributor.contributorName}}"
.
Как я понимаю, причина этого шаблона для отслеживания изменений в этой записи заключается в том, что она пришла из реактивного источника. Что мне было интересно, имеет ли это ли смысл создать фактический объект вкладчика и вернуть это вместо просто записи.Но, если бы я должен был сделать это, этот объект не будет замечен для изменений или бы это? Другими словами, может использоваться более традиционный объектно-ориентированный подход с METEOR, имеющий такие модели объектов как наблюдаемые и реактивные (двусторонние привязки), как эти коллекции записи?
Решение
Вы можете делать все, что вы хотите - JavaScript - это прототип, поэтому достаточно, чтобы получить правильный прототип и изменять его.
Чтобы улучшить поведение элемента сбора, необходимо использовать метод transform
:
Contributor = function(doc) {
_.extend(this, doc); // initialize object with contents of doc
...
};
Contributors = new Meteor.Collection('contributors', {
transform: function(doc) {
return new Contributor(doc);
},
});
.
Теперь вы можете добавить методы прототипа вкладчика:
_.extend(Contributor.prototype, {
someFunction: function() {...},
otherFunction: function() {...},
...
});
.
Если вы хотите настроить методы сбора, он даже проще:
Contributors._findOne = Contributors.findOne;
Contributors.findOne = function() {
var contributor = Contributors._findOne.apply(this, arguments);
if(!contributor) {
// initialize and save new contributor
...
}
return contributor;
};
.
С этими методами вы можете ввести желаемое поведение для сбора и его элементов.