4

ReactiveVar を使用しようとしました。ReactiveVar の処理方法がわかりません。ここで私が試したコード。

Template.Home.helpers({
  names: function(){
    temp = Template.instance().name.get();
    return temp;
  }
});

Template.Home.onCreated(function () {
  this.name = new ReactiveVar();
  Meteor.call("getNames", function(error, result) {
    if(error){
      alert("Oops!!! Something went wrong!");
      return;
    } else {
      this.name.set(result); // TypeError: Cannot call method 'set' of undefined
      return;
    }
  });
});

ReactiveVar を設定して取得するのは正しいですか? またはReactiveVarを設定および取得する方法??

4

1 に答える 1

8

あなたのロジックは正しいです。エラーは実際には一般的な JS の落とし穴です。Meteor.callコールバック関数内で、thisスコープが変更され、テンプレート インスタンスを参照しなくなります。

Function.prototype.bindコードを使用して更新する必要があります。

Template.Home.onCreated(function () {
  this.name = new ReactiveVar();
  Meteor.call("getNames", function(error, result) {
    if(error){
      alert("Oops!!! Something went wrong!");
      return;
    }
    this.name.set(result);
  // bind the template instance to the callback `this` context
  }.bind(this));
});

クロージャによってキャプチャされたローカル変数を使用することもできます (このスタイルは JS プロジェクトでよく見られます)。

Template.Home.onCreated(function () {
  // use an alias to `this` to avoid scope modification shadowing
  var template = this;
  template.name = new ReactiveVar();
  // the callback is going to capture the parent local context
  // it will include our `template` var
  Meteor.call("getNames", function(error, result) {
    if(error){
      alert("Oops!!! Something went wrong!");
      return;
    }
    template.name.set(result);
  });
});
于 2015-05-08T06:10:28.157 に答える