触发 Tracker 的自动运行功能需要什么?
What is necessary to fire Tracker's autorun function?
我有这样一个 Meteor 应用的例子:
import React from 'react';
import { Meteor } from 'meteor/meteor';
import { render } from 'react-dom';
import { Mongo } from 'meteor/mongo';
Things = new Mongo.Collection('things');
if (Meteor.isClient) {
Meteor.startup(() => {
Tracker.autorun(() => {
console.log('AUTORUN');
});
Meteor.subscribe('things');
render(<div>Hello world</div>, document.getElementById('app'));
});
} else if (Meteor.isServer) {
Meteor.publish('things', function() {
return Things.find({});
});
}
我预计在修改我的 Things
集合中的一个文档时,应该会触发自动运行功能,但事实并非如此。所以我的问题是:修改订阅数据后应该满足什么条件才能触发自动运行功能?
你这里有 2 个错误:
A Tracker.autorun
仅检测它包装的函数(作为其参数的函数)内的更改。这里你只有一个console.log
,它不是自动运行可以观察的反应源。
Pub/Sub机制和文档本身是有区别的。当您修改文档时,您的订阅不会更改。但是如果你在自动运行中放置一个 Collection query,那么查询返回的游标是一个反应源,当文档被修改时它也会改变。
所以你可以这样做:
Meteor.startup(() => {
Meteor.subscribe('things');
Tracker.autorun(() => {
Things.find(); // <= Reactive source
console.log('AUTORUN');
});
});
我有这样一个 Meteor 应用的例子:
import React from 'react';
import { Meteor } from 'meteor/meteor';
import { render } from 'react-dom';
import { Mongo } from 'meteor/mongo';
Things = new Mongo.Collection('things');
if (Meteor.isClient) {
Meteor.startup(() => {
Tracker.autorun(() => {
console.log('AUTORUN');
});
Meteor.subscribe('things');
render(<div>Hello world</div>, document.getElementById('app'));
});
} else if (Meteor.isServer) {
Meteor.publish('things', function() {
return Things.find({});
});
}
我预计在修改我的 Things
集合中的一个文档时,应该会触发自动运行功能,但事实并非如此。所以我的问题是:修改订阅数据后应该满足什么条件才能触发自动运行功能?
你这里有 2 个错误:
A
Tracker.autorun
仅检测它包装的函数(作为其参数的函数)内的更改。这里你只有一个console.log
,它不是自动运行可以观察的反应源。Pub/Sub机制和文档本身是有区别的。当您修改文档时,您的订阅不会更改。但是如果你在自动运行中放置一个 Collection query,那么查询返回的游标是一个反应源,当文档被修改时它也会改变。
所以你可以这样做:
Meteor.startup(() => {
Meteor.subscribe('things');
Tracker.autorun(() => {
Things.find(); // <= Reactive source
console.log('AUTORUN');
});
});