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