Meteor.subscribe 和 MyCollection.find* 操作如何交互?
How do Meteor.subscribe and MyCollection.find* operations interact?
我一直在关注许多流星示例并通过发现流星进行工作,现在我留下了很多问题。我明白 subscribe
和 fetch
是让 "reactivity" 正常工作的方法,但我仍然不确定 find 操作和 subscriptions/fetch 之间的关系。我将尝试提出一些问题,以便探索一些 holistic/conceptual 答案。
问题集 1:
在下面的示例中,我们正在获取 1 个对象并订阅其上的更改:
Meteor.subscribe('mycollection', someID);
Mycollection.findOne(someID);
这里的操作顺序重要吗?
这个订阅什么时候"expire"?
问题集 2:
在某些情况下,我们想要查找外键并像这样使用 fetch
:
MyCollection2.find({myCollection1Id: doc1Id}).fetch();
我们在使用fetch
时还需要MyColletion2.subscribe
吗?
订阅如何与 "foreign keys" 一起使用?
fetch ~= 是订阅吗?
问题集 3:
Tracker.autorun
的正确用法是什么?
Why/when 我应该使用它而不是订阅或获取吗?
订阅后会发生什么 find/fetch
客户端调用 subscribe
通知服务器客户端想要查看一组特定的文档。
服务器接受或拒绝订阅请求并发布匹配的文档集。
稍后(网络延迟后)文档到达客户端。它们存储在名为 minimongo 的浏览器中的数据库中。
在存储上述文档的集合上的后续fetch
/find
将查询minimongo(不是服务器)。
如果订阅的文档集发生变化,服务器会发布一份新的副本给客户端。
推荐阅读:understanding meteor publications and subscriptions.
问题 1
顺序很重要。您看不到未订阅的文档(假设 autopublish
已关闭)。但是,正如我在 common mistakes 中指出的那样,订阅不会阻塞。因此,订阅后立即获取应该 return undefined
.
订阅不会自行停止。这是细分:
全局订阅(在您的路由器或模板之外进行的订阅)将永远不会停止,直到您调用其 stop 方法。
当路线改变时(有一些注意事项),路线订阅(iron router)将停止。
一个template subscription会在模板被销毁时停止
问题2
这应该主要由我的回答的第一部分解释。您需要这两套文档才能在客户端加入它们。您可以同时从服务器发布这两个集合,也可以单独发布 - 这是一个复杂的主题,取决于您的用例。
问题3
这两个有点正交。 autorun
是一种创建反应式计算的方法(只要其反应变量发生变化就会运行的函数)- 请参阅文档中有关 reactivity 的部分。 find
/fetch
或 subscribe
可能 发生 在 autorun
内部,具体取决于您的用例。一旦您更多地了解 meteor 的工作原理,这可能会变得更加清楚。
本质上,当您订阅数据集时,它会用该数据填充 minimongo,这些数据存储在 window 的本地存储中。这就是用数据填充 Mongo 的客户端实例的原因,否则,基本上所有查询都将 return 未定义数据或空列表。
总而言之:订阅和发布用于将不同的数据提供给不同的用户。最常见的例子是根据角色提供不同的数据。例如,假设您有一个 Web 应用程序,您可以在其中看到一个 "public" 和一个 "friend" 配置文件。
Meteor.publish('user_profile', function (userId) {
if (Roles.userIsInRole(this.userId, 'can-view', userId)) {
return Meteor.users.find(userId, {
fields: {
public: 1,
profile: 1,
friends: 1,
interests: 1
}
});
} else {
return Meteor.users.find(userId, {
fields: { public: 1 }
});
}
});
现在,如果您以非该用户好友的用户身份登录,并且进行了 Meteor.subscribe('user_profile', 'theidofuser')
和 Meteor.users.findOne()
,您将只能看到他们的 public 个人资料。如果您将自己添加到用户组的 can-view
角色,您将能够看到 public、个人资料、朋友和兴趣。本质上是为了安全。
知道了这一点,以下是您问题的答案分解方式:
操作顺序很重要,因为除非它在反应块中(如 Tracker.autorun 或 Template.helpers),否则你将得到未定义。
使用fetch的时候还是需要使用subscribe。 fetch 真正做的只是 return 一个数组而不是游标。使用外键发布有时是一个相当高级的问题,我建议使用 reywood:publish-composite,它会为您处理烦人的细节
Tracker.autorun 监视块内的反应变量,并在其中一个发生变化时重新运行函数。您实际上并没有使用它来代替订阅,您只是用它来观察范围内的变量。
我一直在关注许多流星示例并通过发现流星进行工作,现在我留下了很多问题。我明白 subscribe
和 fetch
是让 "reactivity" 正常工作的方法,但我仍然不确定 find 操作和 subscriptions/fetch 之间的关系。我将尝试提出一些问题,以便探索一些 holistic/conceptual 答案。
问题集 1:
在下面的示例中,我们正在获取 1 个对象并订阅其上的更改:
Meteor.subscribe('mycollection', someID);
Mycollection.findOne(someID);
这里的操作顺序重要吗?
这个订阅什么时候"expire"?
问题集 2:
在某些情况下,我们想要查找外键并像这样使用 fetch
:
MyCollection2.find({myCollection1Id: doc1Id}).fetch();
我们在使用fetch
时还需要MyColletion2.subscribe
吗?
订阅如何与 "foreign keys" 一起使用?
fetch ~= 是订阅吗?
问题集 3:
Tracker.autorun
的正确用法是什么?
Why/when 我应该使用它而不是订阅或获取吗?
订阅后会发生什么 find/fetch
客户端调用
subscribe
通知服务器客户端想要查看一组特定的文档。服务器接受或拒绝订阅请求并发布匹配的文档集。
稍后(网络延迟后)文档到达客户端。它们存储在名为 minimongo 的浏览器中的数据库中。
在存储上述文档的集合上的后续
fetch
/find
将查询minimongo(不是服务器)。如果订阅的文档集发生变化,服务器会发布一份新的副本给客户端。
推荐阅读:understanding meteor publications and subscriptions.
问题 1
顺序很重要。您看不到未订阅的文档(假设 autopublish
已关闭)。但是,正如我在 common mistakes 中指出的那样,订阅不会阻塞。因此,订阅后立即获取应该 return undefined
.
订阅不会自行停止。这是细分:
全局订阅(在您的路由器或模板之外进行的订阅)将永远不会停止,直到您调用其 stop 方法。
当路线改变时(有一些注意事项),路线订阅(iron router)将停止。
一个template subscription会在模板被销毁时停止
问题2
这应该主要由我的回答的第一部分解释。您需要这两套文档才能在客户端加入它们。您可以同时从服务器发布这两个集合,也可以单独发布 - 这是一个复杂的主题,取决于您的用例。
问题3
这两个有点正交。 autorun
是一种创建反应式计算的方法(只要其反应变量发生变化就会运行的函数)- 请参阅文档中有关 reactivity 的部分。 find
/fetch
或 subscribe
可能 发生 在 autorun
内部,具体取决于您的用例。一旦您更多地了解 meteor 的工作原理,这可能会变得更加清楚。
本质上,当您订阅数据集时,它会用该数据填充 minimongo,这些数据存储在 window 的本地存储中。这就是用数据填充 Mongo 的客户端实例的原因,否则,基本上所有查询都将 return 未定义数据或空列表。
总而言之:订阅和发布用于将不同的数据提供给不同的用户。最常见的例子是根据角色提供不同的数据。例如,假设您有一个 Web 应用程序,您可以在其中看到一个 "public" 和一个 "friend" 配置文件。
Meteor.publish('user_profile', function (userId) {
if (Roles.userIsInRole(this.userId, 'can-view', userId)) {
return Meteor.users.find(userId, {
fields: {
public: 1,
profile: 1,
friends: 1,
interests: 1
}
});
} else {
return Meteor.users.find(userId, {
fields: { public: 1 }
});
}
});
现在,如果您以非该用户好友的用户身份登录,并且进行了 Meteor.subscribe('user_profile', 'theidofuser')
和 Meteor.users.findOne()
,您将只能看到他们的 public 个人资料。如果您将自己添加到用户组的 can-view
角色,您将能够看到 public、个人资料、朋友和兴趣。本质上是为了安全。
知道了这一点,以下是您问题的答案分解方式:
操作顺序很重要,因为除非它在反应块中(如 Tracker.autorun 或 Template.helpers),否则你将得到未定义。
使用fetch的时候还是需要使用subscribe。 fetch 真正做的只是 return 一个数组而不是游标。使用外键发布有时是一个相当高级的问题,我建议使用 reywood:publish-composite,它会为您处理烦人的细节
Tracker.autorun 监视块内的反应变量,并在其中一个发生变化时重新运行函数。您实际上并没有使用它来代替订阅,您只是用它来观察范围内的变量。