在模板助手中连接两个查询的结果
Concatenate results of two queries in a template helper
我有两个合集:Commands
和 CommandHistory
。我正在尝试生成一个输出,该输出接收到它们的组合结果,其中 CommandHistory
中的任何内容都是粗体。也就是说,看起来像:
**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
这是助手的基本开始:
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.
}
我唯一真正能想到的就是制作另一个 (null
) 集合并将两个集合中的所有内容输出到其中,这似乎有点过分了。
是否可以将这两个游标的结果连接起来,并且仍然让它反应?
我认为您正在寻找的主要是一种合并两个结果集的方法。
为此,您可以使用这样的东西:
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) });
}
我在这里添加了一个名为 "origin" 的字段来标识每个条目的来源。此外,我正在根据时间戳对组合数据集进行排序,我正在考虑使用一个简单的数字来简化示例。
合并数据集后,您可以使用另一个助手打印它们,returns 带或不带 **,取决于来源:
output: function(obj) {
var text = obj.value || "";
if(obj.origin == 'history') text = "**"+text+"**";
return text
}
这是您可以尝试的示例代码:
HTML:
你好
<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});
}
});
}
我有两个合集:Commands
和 CommandHistory
。我正在尝试生成一个输出,该输出接收到它们的组合结果,其中 CommandHistory
中的任何内容都是粗体。也就是说,看起来像:
**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
这是助手的基本开始:
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.
}
我唯一真正能想到的就是制作另一个 (null
) 集合并将两个集合中的所有内容输出到其中,这似乎有点过分了。
是否可以将这两个游标的结果连接起来,并且仍然让它反应?
我认为您正在寻找的主要是一种合并两个结果集的方法。 为此,您可以使用这样的东西:
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) });
}
我在这里添加了一个名为 "origin" 的字段来标识每个条目的来源。此外,我正在根据时间戳对组合数据集进行排序,我正在考虑使用一个简单的数字来简化示例。
合并数据集后,您可以使用另一个助手打印它们,returns 带或不带 **,取决于来源:
output: function(obj) {
var text = obj.value || "";
if(obj.origin == 'history') text = "**"+text+"**";
return text
}
这是您可以尝试的示例代码:
HTML: 你好
<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});
}
});
}