在我的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}}"
据我了解,此模板跟踪此记录更改的原因是因为它来自反应源。 我想知道的是创建一个实际的Contributor对象是否有意义,并返回而不仅仅是一个记录。但是,如果我这样做,这个对象将不会被观察到变化,或者它会被观察到? 换句话说,可以使用更传统的面向对象的方法与meteor一起使用,将这些Model对象作为可观察和反应(双向绑定)作为那些Collection记录?
答案 0 :(得分:2)
你可以随心所欲 - 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;
};
使用这些技术,您可以将所需的行为注入集合及其元素。