Meteor ReactiveVar не запускает обновление шаблона - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть простое приложение, в котором я пытаюсь сделать мой источник данных реактивным, у меня есть эта коллекция

/imports/api/TestsCollection.js * * 1004

import { Mongo } from 'meteor/mongo';
import { Factory } from 'meteor/dburles:factory';
import SimpleSchema from 'simpl-schema';


class TestsCollection extends Mongo.Collection {
    constructor(collectionName){
        super(collectionName);
        console.log('created');
    }
    insert(doc, callback) {
        const ourDoc = doc;
        ourDoc.testField = new Buffer([0,1,2]);
        const result = super.insert(ourDoc, callback);
        return result;
    }
}

export const Tests = new TestsCollection ('tests');

Tests.schema = new SimpleSchema({

    name: {
        type: String,
        max: 512,
        required: true,
    },
    text: {
        type: String,
        max: 512,
        required: true
    },
    testField: {
        type: Buffer,
        max: 512,
        required: true
    }

});

Tests.attachSchema(Tests.schema);

Что публикуется через:

/imports/api/server/publications.js:

import { Meteor } from 'meteor/meteor';

import { Tests } from '../tests';

Meteor.publish('tests', function () {
    return Tests.find({});
});

Итак, теперь я хочу включить эту коллекцию в свой шаблон:

test_Tmp.html:

<template name='test_Tmp'>
<h3>This is test page #1</h3>
<table>
  <tr>
     <th>name</th>
     <th>info</th>
  </tr>
  {{#unless testsReady}}
     {{ >spinner }}
  {{else}}
  {{#each getTests}}
  <tr>
      <td>{{name}}</td>
      <td>{{text}}</td>
  </tr>
  {{/each}}
  {{/unless}}
</table>
</template>

Итак, добавили sacha:spinner для отображения счетчика ожидания и помощника testsReady, вот код js:

test_Tmp.js

import './test_Tmp.html';
import { Mongo } from "meteor/mongo";

import { ReactiveVar } from 'meteor/reactive-var';
const Tests = new Mongo.Collection('tests');

Template.test_Tmp.onCreated(function() {

    this.testsReady = new ReactiveVar(false);

    var self = this;

    var sub = this.subscribe('tests');
    Tracker.autorun(function () {
            if(sub.ready()){
                self.testsReady.set(true);
                console.log(self.testsReady.get());
            }
    })
});


Template.test_Tmp.helpers({
    testsReady: function() {
        var result = Template.instance().testsReady.get();
        console.log(result);
        return result;
    },
    getTests: function(){
        var data = Tests.find({});

        return data;

    }
});

Как вы можете видеть, я использую реактивный помощник testsReady, но когда я загружаю эту страницу, я вижу spinner, сообщение 'true' в консоли браузера из блока Tracker.autorun, поэтому testsReady обновляется до true, но после этого testsReady помощник не будет вызван во второй раз, и у меня будет вертеться навсегда. кто-нибудь помогите. Я использую Flow Router с плагином BlazeLayout, вот мои маршруты:

import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';

import '../../ui/layouts/test_Layout'
import '../../ui/pages/test_Tmp'
import '../../ui/pages/funny_Tmp'


FlowRouter.route('/funny', {
    name: 'funny',
    action: function(params) {
        BlazeLayout.render("test_Layout", {main: "funny_Tmp"});
    }
});

FlowRouter.route('/tests', {
    name: 'tests',
    action: function(params) {
        BlazeLayout.render("test_Layout", {main: "test_Tmp"});
    }
});

Так что все это происходит при загрузке маршрута / тестов

...