2016-03-29 19 views
0

İki koleksiyonum var: Commands ve CommandHistory. CommandHistory'dan herhangi bir şeyin kalın olduğu her ikisinin sonuçlarını bir araya getiren bir çıktı yapmaya çalışıyorum.Bir şablon yardımcısında iki sorgunun sonuçlarını birleştirin

log() { 
    const commandCursor = Commands.find({}, { sort: { timestamp: 1 } }); 
    const commandHistory = CommandHistory.find({}, { sort: { timestamp: 1 } }); 
    // what now? Need to concatenate them. 
    // `.fetch()` makes the interface seem non-reactive. 
} 

Gerçekten düşünebildiğim tek şey bir başka (null) toplanması ve çıkış yapmaktır: Burada

**Do the thing** <--| **Command History* 
Doing thing   <-| 
thing is in progress <-| Commands 
thing is done   <-| 
**Do the other thing**    <-| **Command History** 
I don't know what the other thing is <-| Commands 

bir yardımcı temel bir başlangıçtır: Yani, benziyordu şeydir Her iki koleksiyondan da ona her şeyden çok fazla benziyor.

Bu iki imlecin sonuçlarını birleştirmek mümkün mü ve yine de reaktif davranıyor mu?

+0

"Komutlar" ile "CommandHistory" arasındaki bir anahtar var mı? Sonuncusu için her biri için birkaç tane var gibi görünüyor. –

+0

CommandHistory, bir form gönderdiğinde ve bu formun değerlerini içerdiğinde eklenir. Başarılı bir şekilde gönderildikten sonra, bu komutu bir Meteor yöntemi olan – corvid

+0

üzerinden çalıştırır. Yani iki koleksiyon arasında önemli bir ilişki var mı? –

cevap

1

Bence aradığınız şey esas olarak her iki sonuç kümesini birleştirmenin bir yoludur. Bunun için , böyle bir şey kullanabilirsiniz: Burada

log: function() { 
     var commands = Commands.find({}, { sort: { timestamp: 1 } }).map(function(i){i.origin='command'; return i;}); 
     var history = History.find({}, { sort: { timestamp: 1} }).map(function(i){i.origin='history'; return i;}); 
     var combined = _.union(commands, history); 
     return _.sortBy(combined, function(i) { return Number(i.timestamp) }); 
    } 

ben her bir giriş nereden geldiğini belirlemek için "origin" adlı bir alan ekliyorum. Ayrıca, örnek verileri sadeleştirmek için basit bir sayı düşündüğüm zaman damgasını temel alan birleştirilmiş veri kümesini sıralıyorum.

veri seti kombine sonra, kökeni bağlı olan veya ** olmadan döndüren başka yardımcısı kullanarak bunları yazdırabilirsiniz: deneyebileceğiniz İşte

output: function(obj) { 
    var text = obj.value || ""; 
    if(obj.origin == 'history') text = "**"+text+"**"; 
    return text 
} 

örnek kod:

HTML: merhaba

<body> 
    {{> hello}} 
</body> 

<template name="hello"> 
    <ul> 
    {{#each log}} 
     <li>{{output this}}</li> 
    {{/each}} 
    </ul> 
</template> 

JS:

Commands = new Mongo.Collection("commands"); 
History = new Mongo.Collection("history"); 

if (Meteor.isClient) { 
    // counter starts at 0 
    Session.setDefault('counter', 0); 

    Template.hello.helpers({ 
    log: function() { 
     var commands = Commands.find({}, { sort: { timestamp: 1 } }).map(function(i){i.origin='command'; return i;}); 
     var history = History.find({}, { sort: { timestamp: 1} }).map(function(i){i.origin='history'; return i;}); 
     var combined = _.union(commands, history); 
     return _.sortBy(combined, function(i) { return Number(i.timestamp) }); 
    }, 

    output: function(obj) { 
     var text = obj.value || ""; 
     if(obj.origin == 'history') text = "**"+text+"**"; 
     return text 
    } 
    }); 

} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
    Commands.remove({}); 
    History.remove({}); 
    for (var i=1; i<5; i++) { 
     History.insert({value: 'history '+i, timestamp: 10*i}); 
     for (var j=1; j<4; j++) 
     Commands.insert({value: 'command '+i+'.'+j, timestamp: 10*i+j}); 
    } 
    }); 
} 
İlgili konular