我有几个不同的视图(客户端代码),我需要插入/更新我的集合。我没有让重复的代码处理插入/更新,而是将其拉出到一个单独的文件中,其功能可以全局访问。
我已经看到了几个使用构造Meteor.methods完成此操作的示例。难道不是所有的Meteor.method都在服务器上执行了吗?这对延迟补偿有何影响?有一个更好的方法吗?或者这是目前可以接受的方法吗?
答案 0 :(得分:3)
我将它们放在一个方法中,但是将方法暴露给客户端。换句话说,不要将它放在server
目录中,也不要用if (Meteor.isServer)
保护它。我更喜欢在collections
目录中定义我的所有集合及其方法,这些目录由客户端和服务器加载。如果客户端具有方法的定义,则称为存根。有了这些信息,我建议您重新阅读docs的方法部分。简短版本是因为延迟补偿,代码将在客户端和服务器上并行运行。您可以通过在定义中放置一个简单的console.log
来验证这一点(它将在调用时打印到浏览器控制台和命令控制台)。为了更加花哨地使用存根,您可以看到this视频。
答案 1 :(得分:2)
在我这边,我使用以下结构:
/common/collections/[each collection gets a file where it is defined]
/common/models/[each collection gets a model file where the model is defined]
这样我可以在客户端和服务器上重用尽可能多的代码
我使用CoffeeScript创建类,但你可以在普通的Javascript中执行相同的操作。
我的模型构造函数接受属性的散列(流星对象),并从那里可以封装我的方法。
OffTopic#1:作为奖励,我的模型扩展了一个名为“MeteorModel”的超级对象,我将共享代码放在模型之间。
OffTopic#2:我还在这些模型中放入了允许和拒绝逻辑,以便我可以从客户端或服务器端执行任意验证。非常有用,因为我还没有找到一种更好的方法来模拟对象修改,而无需在普通Meteor中实际修改它。
我不喜欢直接使用Meteor.Collections并编写我的代码,因为目前还不清楚Meteor将如何发展,我希望有空间改变我的方法。