很明显,我对ReactiveVar做了一些错误的事情,因为我无法使它按预期工作。
我试图通过调用Meteor.call方法来设置ReactiveVar的值,该方法返回用户名列表。但当应用程序的另一部分更改用户名时,它不会更新。
我两种都试过了:
Template.qastatistics.created = function () {
this.trackUsernames = new ReactiveVar(false);
var instance = Template.instance();
Meteor.call('trackUsernames', function (err, data) {
instance.trackUsernames.set(data);
});
};
和:
Template.qastatistics.helpers({
users: function () {
var usernames,
instance = Template.instance();
if (instance.trackUsernames.get() === false) {
Meteor.call('trackUsernames', function (err, data) {
instance.trackUsernames.set(data);
});
}
usernames = instance.trackUsernames.get();
...
但当数据库中的用户名发生变化时,两者都不会更新用户名列表。
这在ReactiveVars中可能吗?还是我完全误解了它们?
编辑:我提到的用户名不是来自Meteor.users集合,而是来自另一个包含用户名的集合的不同调用。
首先,我将使用onCreated
函数,而不是定义created
。这是一个更可扩展的,它是新的API。created
只是为了向后兼容性而保留的。
关于你的问题。你是对的,你似乎误解了ReactiveVar
的作用。它们是被动的数据源。这意味着,当您在某些Tracker.autorun
(也称为反应式计算(中调用myReactiveVar.get
时,无论何时调用myReactiveVar.set
,计算都将重新运行。
你把第一部分说对了。空格键辅助对象始终在自己的计算中运行。您的错误是认为方法调用是一个反应性操作。这意味着,您可以调用trackUsernames
并再次设置trackUsernames
ReativeVar
,模板中的值将自行更新。但是一个方法只运行一次。它对反应性没有任何幻想。
方法调用只传输一次数据。另一方面,当您发布一组文档(像所有用户一样(时,它们将动态更新。每当该组已发布文档中发生更改时,都会将其同步到客户端因此,一般来说,最好使用发布和订阅来被动同步数据。如果你想用一种方法做同样的事情,你需要做一些民意调查(所以你又回到了石器时代(。
实现您正在尝试做的事情的最简单方法是使用Meteor.users.find().fetch()
。正如文档中所说,fetch
为您正在获取的所有文档注册依赖关系,如果它是从反应式计算中调用的。
首先,您需要正确设置您的发布,以便用户可以看到其他用户的用户名。我把这个留给你。然后你需要重新实现你的助手
Template.qastatistics.helpers({
users: function () {
var usernames = _.pluck(Meteor.users.find().fetch(), 'username');
...
感谢@kyll的建议,我通过发布我需要的数据来获得我想要的:
服务器:
cope.publish.usernamesID = Random.id();
Meteor.publish("itemsusernames", function () {
self = this;
var initializing = true;
var handle = Items.find().observeChanges({
added: function (id) {
!initializing && self.changed(
"itemsusernames",
cope.publish.usernamesID,
Items.distinct("p4User"));
},
changed: function (id) {
!initializing && self.changed(
"itemsusernames",
cope.publish.usernamesID,
Items.distinct("p4User"));
},
removed: function (id) {
!initializing && self.changed(
"itemsusernames",
cope.publish.usernamesID,
Items.distinct("p4User"));
}
});
initializing = false;
self.added("itemsusernames", cope.publish.usernamesID, Items.distinct("p4User"));
self.ready();
self.onStop(function () {
handle.stop();
});
});
客户端:
users: function () {
var usernames = [],
oUsernames = ItemsUsernames.find().fetch();
if (!oUsernames[0]) return [];
usernames = $.map(oUsernames[0], function (value, index) {
if (!isNaN(index)) {
return [value];
}
});
...
当然:ItemsUsernames = new Mongo.Collection("itemsusernames");