触发 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 个错误:

  1. A Tracker.autorun 仅检测它包装的函数(作为其参数的函数)内的更改。这里你只有一个console.log,它不是自动运行可以观察的反应源。

  2. Pub/Sub机制和文档本身是有区别的。当您修改文档时,您的订阅不会更改。但是如果你在自动运行中放置一个 Collection query,那么查询返回的游标是一个反应源,当文档被修改时它也会改变。

所以你可以这样做:

Meteor.startup(() => {
    Meteor.subscribe('things');

    Tracker.autorun(() => {
        Things.find(); // <= Reactive source
        console.log('AUTORUN');
    });
});