Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.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 简单地说,Tracker.autorun做什么?_Javascript_Meteor - Fatal编程技术网

Javascript 简单地说,Tracker.autorun做什么?

Javascript 简单地说,Tracker.autorun做什么?,javascript,meteor,Javascript,Meteor,跟踪器方法并不完全属于Meteor功能的核心,在教程和初学者书籍中很少使用(如果是,也没有很好地解释),因此被认为比框架的大多数其他部分更“可怕” 一、 例如,我从未设法将Tracker.autorun加入到我的项目中,因为它似乎从来没有达到预期的效果。这就是文档所说的: 现在运行一个函数,以后每当它的依赖项 改变 对我来说,这听起来像是让非反动来源变得反动的一种方式,但接下来你会看到一些例子,第一个例子是这样的: Tracker.autorun(function () { var olde

跟踪器方法并不完全属于Meteor功能的核心,在教程和初学者书籍中很少使用(如果是,也没有很好地解释),因此被认为比框架的大多数其他部分更“可怕”

一、 例如,我从未设法将
Tracker.autorun
加入到我的项目中,因为它似乎从来没有达到预期的效果。这就是文档所说的:

现在运行一个函数,以后每当它的依赖项 改变

对我来说,这听起来像是让非反动来源变得反动的一种方式,但接下来你会看到一些例子,第一个例子是这样的:

Tracker.autorun(function () {
  var oldest = _.max(Monkeys.find().fetch(), function (monkey) {
    return monkey.age;
  });
  if (oldest)
    Session.set("oldest", oldest.name);
});
这与不使用Tracker.autorun有什么区别?游标已经是一个反动源,为了让事情更加混乱,下一个示例处理另一个反动源:会话


Tracker.autorun
是否仅适用于反动源,如果是,在
跟踪器中使用它们有什么好处?使它们双重反动?

为了实现反应式编程(事件驱动编程的一种变体),Meteor使用了两种不同的概念:

  • 反应式计算:每次修改基础依赖项时都会反应式重新运行的代码片段
  • 反应式数据源:当在反应式计算中使用时,能够注册依赖关系的对象,以使其无效并使其使用新的数据值再次运行
这两个概念由两个很少使用的底层
Tracker
对象实现,即helper对象和helper对象,helper对象是存储一组计算的容器

跟踪器。计算是一个具有两种重要方法的对象:

  • invalidate()
    ,这将导致计算重新运行
  • onInvalidate(回调)
    用于实际运行计算任意代码
当您调用
Tracker.autorun
时,您基本上是在创建一个新的计算,并使用作为参数传递的函数注册一个
onInvalidate
回调

一个
Tracker.Dependency
是一个包含两种方法的计算集合

  • depend()
    :将当前计算添加到集合中
  • changed()
    :调用时,使每个注册的计算无效
当反应数据源在计算中注册依赖项时,它调用
依赖项.dependence()
,这只是将当前计算(如果有)添加到跟踪计算集中

修改被动数据源时,它将调用
Dependency.changed()
,这将使集合中所有注册的计算无效

来源:

在Meteor框架中,通常只处理几个实现反应式编程概念的更高级别对象

  • 反应式计算是使用Tracker.autorun生成的,默认情况下,模板帮助程序总是在反应式计算中运行
  • 反应式数据源使用
    Tracker.Dependency
    使计算无效,它们包括MiniMongo游标、
    Session
    变量、
    Meteor.user()
使用
Tracker.autorun
当您需要在模板帮助程序外部(例如在模板
onRendered
生命周期事件内部)以反应方式重新运行任意代码时,请使用快捷方式
this.autorun
(生成反应式计算,该计算在模板被销毁时自动停止)对任何反应性数据源修改作出反应

下面是一个模板的小示例,它计算您单击按钮的次数,并在单击10次时将计数器重置为0

HTML


回答得很好,它解决了我在onRendered中遇到的另一个问题,在Tracker.autorun中,我无法使用此.find(“…”)访问模板。通过使用this.autorun和.bind(这个),我能够让事情正常进行。问题,是否需要.bind(this)来执行this.find(“”)?那么它的目的是什么呢?好吧,这将是另一个整体问题,看一看:Meteor 1.2将引入ES2015支持和箭头功能,使绑定的这种特定用法变得无关紧要。我认为自动运行应该始终处于onCreated状态。我想把它放在渲染器上可能会复制跟踪器。此外,无法从tracker函数访问this.count。通过Template.instance().count访问它。
<template name="counter">
  <div class="counter>
    <button type="button">Click me !</button>
    <p>You clicked the button {{count}} times.</p>
  </div>
</template>
Template.counter.onCreated(function(){
  this.count = new ReactiveVar(0);
});

Template.counter.onRendered(function(){
  this.autorun(function(){
    var count = this.count.get();
    if(count == 10){
      this.count.set(0);
    }
  }.bind(this));
});

Template.counter.helpers({
  count: function(){
    return Template.instance().count.get();
  }
});

Template.counter.events({
  "click button": function(event, template){
    var count = template.count.get();
    template.count.set(count + 1);
  }
});