Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在meteor.helper中等待计算,直到由于template.autorun中的依赖项更改而重新计算为止?_Javascript_Meteor_Meteor Helper_Meteor Tracker - Fatal编程技术网

Javascript 如何在meteor.helper中等待计算,直到由于template.autorun中的依赖项更改而重新计算为止?

Javascript 如何在meteor.helper中等待计算,直到由于template.autorun中的依赖项更改而重新计算为止?,javascript,meteor,meteor-helper,meteor-tracker,Javascript,Meteor,Meteor Helper,Meteor Tracker,当反应性变量发生变化时,我总是会遇到以下错误: 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:182

当反应性变量发生变化时,我总是会遇到以下错误:

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}});
    }
  }
});
让我们一步一步地分解

  • 第一次没有错误
  • 当我更改页面时,以下依赖项将更改:
    Pi()
  • 自动运行将重新运行
  • 由于
    Pi()
    更改,以下变量将更改:
    b&&b.array&&h&&self.d.set(h.ready())和&self.w.set(b.array)
  • 我怀疑
    cList
    是在页面更改后立即计算的,而不等待自动运行重新计算完成,这就是抛出错误的原因
  • 在自动运行完成重新计算依赖项更改后,
    cLists
    根据依赖项更改显示正确列表。用户界面确实没有问题。但是这个警告看起来很肮脏

  • 我想避免上述警告的方法是在依赖项更改时等待cList。我该怎么做?如何在meteor.helper中等待计算,直到由于template.autorun中的依赖项更改而重新计算为止?

    罪魁祸首是来自
    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}});
        }
      }
    });