У меня есть простое приложение, в котором я пытаюсь сделать мой источник данных реактивным, у меня есть эта коллекция
/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"});
}
});
Так что все это происходит при загрузке маршрута / тестов