Meteorアプリ - 観測可能なオブジェクトを作成する方法はありますか

StackOverflow https://stackoverflow.com//questions/23000134

  •  20-12-2019
  •  | 
  •  

質問

My 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}}" 
.

私が理解しているように、このレコードへの変更を追跡する理由は、それが無効な源から来たためです。 私が疑問に思っていたのは、実際の貢献者オブジェクトを作成することを理解し、単なるレコードの代わりにそれを返すかどうかです。しかし、私がそれをするのであれば、このオブジェクトは変更のために観察されない、またはそれをするでしょうか? 別の単語、それらの収集レコードとして、観察可能で反応性(双方向バインディング)と同じようなモデルオブジェクトを持つ、より伝統的なオブジェクト指向アプローチを使用することができますか?

役に立ちましたか?

解決

あなたが望むものは何でもすることができます - 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;
};
.

これらの技術では、収集とその要素に目的の動作を注入できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top