使用 findone 自动运行跟踪器
Tracker autorun using findone
我在客户端有这段代码:
Tracker.autorun(function () {
if (params && params._id) {
const dept = Department.findOne({ _id: params._id }) || Department.findOne({ name: params._id });
if (dept) {
}
}
});
params 将被传递到 url。因此,最初我们没有部门数据,findOne 方法将为 return null,然后稍后,当数据到达时,我们可以找到部门对象。
但是如果用户输入了无效的id,我们需要return他们404。使用跟踪器自动运行,我如何区分2种情况:
一个。数据还没有,所以 findOne returns null
b。没有这样的数据,即使在服务器的mongodb中,所以findOne也会returns null.
对于情况 a,跟踪器自动运行将正常工作,但对于情况 b,我需要知道 return 404
我建议您订阅模板内的数据,如下所示,这样您就可以知道订阅何时准备就绪,然后您可以检查数据是否存在
Template.myTemplate.onCreated(function onCreated() {
const self = this;
const id = FlowRouter.getParam('_id');
self.subscribe('department', id);
});
Template.myTemplate.onRendered(function onRendered() {
const self = this;
// this will run after subscribe completes sending records to client
if (self.subscriptionsReady()) {
const id = FlowRouter.getParam('_id');
const dept = Department.findOne({ _id: params._id }) || Department.findOne({ name: params._id });
if (dept) {
// found data in db
} else {
// 404 - no department found in db
}
}
});
如果您使用的是 Iron-Router,您可以试试这个 hack。
Router.route('/stores', function() {
this.render('stores', {});
}, {
waitOn: function() {
return [
Meteor.subscribe('stores_db')
];
}
});
上面的示例代码将等待订阅 "stores_db" 完成,然后再呈现任何内容。然后您可以毫无问题地使用您的 findOne
逻辑,确保所有文档都可用。这适合你的情况。
这是我在完全理解 MeteorJS 发布和订阅之前所做的。我不推荐我的解决方案,这对用户体验非常糟糕。在下载文档时,用户将永远看到页面加载。 @Sasikanth 给出了正确的实现。
我在客户端有这段代码:
Tracker.autorun(function () {
if (params && params._id) {
const dept = Department.findOne({ _id: params._id }) || Department.findOne({ name: params._id });
if (dept) {
}
}
});
params 将被传递到 url。因此,最初我们没有部门数据,findOne 方法将为 return null,然后稍后,当数据到达时,我们可以找到部门对象。
但是如果用户输入了无效的id,我们需要return他们404。使用跟踪器自动运行,我如何区分2种情况:
一个。数据还没有,所以 findOne returns null
b。没有这样的数据,即使在服务器的mongodb中,所以findOne也会returns null.
对于情况 a,跟踪器自动运行将正常工作,但对于情况 b,我需要知道 return 404
我建议您订阅模板内的数据,如下所示,这样您就可以知道订阅何时准备就绪,然后您可以检查数据是否存在
Template.myTemplate.onCreated(function onCreated() {
const self = this;
const id = FlowRouter.getParam('_id');
self.subscribe('department', id);
});
Template.myTemplate.onRendered(function onRendered() {
const self = this;
// this will run after subscribe completes sending records to client
if (self.subscriptionsReady()) {
const id = FlowRouter.getParam('_id');
const dept = Department.findOne({ _id: params._id }) || Department.findOne({ name: params._id });
if (dept) {
// found data in db
} else {
// 404 - no department found in db
}
}
});
如果您使用的是 Iron-Router,您可以试试这个 hack。
Router.route('/stores', function() {
this.render('stores', {});
}, {
waitOn: function() {
return [
Meteor.subscribe('stores_db')
];
}
});
上面的示例代码将等待订阅 "stores_db" 完成,然后再呈现任何内容。然后您可以毫无问题地使用您的 findOne
逻辑,确保所有文档都可用。这适合你的情况。
这是我在完全理解 MeteorJS 发布和订阅之前所做的。我不推荐我的解决方案,这对用户体验非常糟糕。在下载文档时,用户将永远看到页面加载。 @Sasikanth 给出了正确的实现。