meteor app - 有没有办法创建可观察对象

时间:2014-04-10 22:19:58

标签: meteor

在我的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记录?

1 个答案:

答案 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;
};

使用这些技术,您可以将所需的行为注入集合及其元素。