2016-08-24 3 views
0

Это было долгое время с тех пор, как я использовал Метеор или пробовал в мире пользовательского интерфейса, так что простите меня, если это плохой вопрос.Meteor JS - Клиентская коллекция, кажется, пуста

API/main.js:

export const Nodes = new Meteor.Collection("nodes"); 
export const Links = new Meteor.Collection("links"); 

сервер/main.js

import { Links, Nodes } from '../api/main.js'; 

Meteor.startup(() => { 
    // code to run on server at startup 
} 

Meteor.methods({ 
    traverseDocument: function traverseDocument(documentKey) { 
    // ... do stuff ... 
    Links.insert(data.links); 
    Nodes.insert(data.nodes); 
    return data; 
    } 
} 

клиент/main.js

import { Links, Nodes } from '../api/main.js'; 
import './main.html'; 

Meteor.startup(function() { 
    // Fetch data via a call 
    Meteor.call("traverseDocument", 'NTD000000228506', function (error, results) {}); 
}); 

Template.viz.rendered = function() { 
    console.log(Nodes.find());     // <-- LocalConnection.Cursor() 
    console.log(Nodes.find().fetch());   // <-- This is empty [] 
    console.log(Nodes._collection._docs._map); // <-- This returns Object{} 
} 

я пробовал: 1. Опубликовать/Подписка 2. Я попробовал вспомогательную функцию 3. Я переместил Meteor.C all() в функцию запуска клиента

Так что теперь это похоже на работу.

Исходный вопрос теперь меняется - Почему find(). Fetch() возвращает пустой массив?

Возможно, я должен опубликовать новый вопрос и отметить этот как фиксированный?

+0

У меня проблема с запахом. В вашем последнем примере кода 'console.log()' выполняет * немедленно * после 'Meteor.call()'. Это означает, что он выполняется задолго до того, как функция 'function (error, results) {}' callback будет запущена. Попробуйте перевести журнал в обратный вызов. – Tomalak

+0

Спасибо за предложение. Это похоже на проблему с синхронизацией, поэтому я попытался переместить Meteor.call() в событие onCreated, но все равно не повезло. Я также пробовал подписку и другие вещи, но до сих пор нет радости. – Exie

+0

Вы использовали 'Meteor.publish()' ваши две коллекции на сервере? –

ответ

1

Вы можете сохранить значение результатов от обратного вызова к переменной сеанса или реактивной переменной, а затем получить позже.

import { Links, Nodes } from '../api/main.js'; 
import './main.html'; 

Template.viz.rendered = function() { 
    Meteor.call("traverseDocument", 'VALUE001', function (error, results) { 
    if(error) { 
     // handle error 
    } 
    else { 
    Session.set('result',results); // save result in session or reactive  variable 
    } 
    console.log(Nodes); // <-- This works, has data 
    }); 

    if(Session.get('result') { 
    console.log(Session.get('result')); // <-- Retrieve value from session or reactive var 
} 
} 
+0

После некоторого фригинга это теперь работает красиво и чисто! Большое спасибо. – Exie