触发Tracker的自动运行功能有什么必要?

时间:2017-02-25 10:25:41

标签: javascript reactjs meteor meteor-tracker

我有一个例子Meteor app:

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

1 个答案:

答案 0 :(得分:2)

你有两个错误:

  1. console.log仅检测其包装的函数内的更改(作为其参数的更改)。这里只有Meteor.startup(() => { Meteor.subscribe('things'); Tracker.autorun(() => { Things.find(); // <= Reactive source console.log('AUTORUN'); }); }); ,这不是自动运行可以观察的反应源。

  2. Pub / Sub机制与文档本身之间存在差异。修改文档时,您的订阅不会更改。但是,如果在自动运行中放置Collection 查询,则查询返回的游标是在文档被修改时更改的反应源。

  3. 所以你可以这样做:

     try {
                        Log.d(TAG, "onPostExecute: this inner of post" + getcontent_for_validate);
                        jsonobj = new JSONObject(getcontent_for_validate);
                        System.out.println("this is get content" + jsonobj.toString());
    
    
                        JSONArray array = jsonobj.getJSONArray("Staff_Details");
                        for (int i = 0; i < array.length(); i++) {
                            Clint_id = editText_user_name.getText().toString();
                            Api_key = array.getJSONObject(i).getString("api_key");
                           COMPANY_LOGO = array.getJSONObject(i).getString("company_logo");
                            Password = editText_password.getText().toString();
                        }
    
    
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }