2

リアクティブ変数が変更されると、常にこのエラーが発生します。

Exception in template helper: Error: $in needs an array
    at Error (native)
    at Object.ELEMENT_OPERATORS.$in.compileElementSelector (http://localhost:3000/packages/minimongo.js?cdf1a26cf7719fa9471a8017c3defd5aea812727:1827:15)
    at http://localhost:3000/packages/minimongo.js?cdf1a26cf7719fa9471a8017c3defd5aea812727:1509:19
    at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:157:22)
    at operatorBranchedMatcher (http://localhost:3000/packages/minimongo.js?cdf1a26cf7719fa9471a8017c3defd5aea812727:1489:5)
    at compileValueSelector (http://localhost:3000/packages/minimongo.js?cdf1a26cf7719fa9471a8017c3defd5aea812727:1393:12)
    at http://localhost:3000/packages/minimongo.js?cdf1a26cf7719fa9471a8017c3defd5aea812727:1372:9
    at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:157:22)
    at compileDocumentSelector (http://localhost:3000/packages/minimongo.js?cdf1a26cf7719fa9471a8017c3defd5aea812727:1355:5)
    at _.extend._compileSelector (http://localhost:3000/packages/minimongo.js?cdf1a26cf7719fa9471a8017c3defd5aea812727:1332:12)

犯人はw(リアクティブ変数)だと思います

これを見てください:

Template.cList.onCreated(function(){
  var self = this;
  self.d = new ReactiveVar()
  self.w = new ReactiveVar()
  self.autorun(function() {
    var b = A.findOne(Pi());
    if (b && b.array) {
      var h = Subs.subscribe('B', b.array)
      self.d.set(h.ready()) // is subscription ready?
      self.w.set(b.array)
    }
  });
});

Template.cList.helpers({
  cLists: function () {
    if (Template.instance().d.get() && Template.instance().w.get()) {  // run only when d and w is ready
      return B.find({_id: {$in:Template.instance().w.get()}}, {fields: {title:1, src:1}});
    }
  }
});

ステップバイステップで分解しましょう...

  1. 初めてエラーなし
  2. ページを変更すると、次の依存関係が変更されます。Pi()
  3. 自動実行が再実行されます。
  4. 変更されるためPi()、次の変数が変更されます。b && b.array && h && self.d.set(h.ready()) && self.w.set(b.array)
  5. cList自動実行の再計算が完了するのを待たずにページ変更の直後に計算されると思われるため、エラーがスローされます。
  6. 自動実行が終了した直後に、依存関係の変更を再計算し、依存関係cListsの変更の変更に従って正しいリストを表示します。実際、ユーザー インターフェイスに問題はありません。しかし、この警告は汚いように見えます。

上記の警告を回避するには、依存関係が変更されたときに cList を待機することだと思います。それ、どうやったら出来るの?template.autorun の依存関係の変更による再計算が行われるまで、meteor.helper で計算を待機するにはどうすればよいですか?

4

1 に答える 1

1

犯人はready callback...meteorhacks:subs-managerテンプレートサブスクリプションで変更するとエラーが回避されます...

Template.cList.onCreated(function(){
  var self = this;
  self.d = new ReactiveVar()
  self.w = new ReactiveVar()
  self.autorun(function() {
    var b = A.findOne(Pi());
    if (b && b.array) {
      self.subscribe('B', b.array)
      self.w.set(b.array)
    }
  });
});

Template.cList.helpers({
  cLists: function () {
    if (Template.instance().subscriptionsReady() && Template.instance().w.get()) {  // run only when subscription and w is ready
      return B.find({_id: {$in:Template.instance().w.get()}}, {fields: {title:1, src:1}});
    }
  }
});
于 2016-01-23T12:19:08.237 に答える