【问题标题】:What is necessary to fire Tracker's autorun function?触发 Tracker 的自动运行功能需要什么?
【发布时间】:2017-02-25 10:25:40
【问题描述】:

我有这样一个 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 集合中的一个文档时,应该触发自动运行功能,但事实并非如此。所以我的问题是:修改订阅数据后应该满足什么条件才能触发自动运行功能?

【问题讨论】:

    标签: javascript reactjs meteor meteor-tracker


    【解决方案1】:

    这里有两个错误:

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

    2. Pub/Sub 机制与文档本身之间存在差异。当您修改文档时,您的订阅不会改变。但是,如果您在自动运行中放置一个集合查询,则查询返回的光标是一个响应式源,在修改文档时会更改。

    所以你可以这样做:

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

    【讨论】:

    • 好的,谢谢 - 如我所见,autorun 函数仅在其中一些数据被物理(fetchfindOne)占用时运行?我是否完全理解这种反应只有在这种情况下才有可能,或者他们是否有其他方法可以实现这一目标?
    • 任何反应式来源。通常是 SessionReactiveVar,除了 Collection 游标。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多