Sam*_*amo 22 model behavior backbone.js meteor
在Meteor中,当您从数据库中检索记录时,它只是一条记录.因此,如果我有一个名为的集合Dogs,dog可能有fur: 'brown'或者breath: 'stinky',但它没有bark()方法.
显然,我可以创建一些期望dog作为参数然后对其执行操作的函数dog.我甚至可以将所有这些函数封装到一个构造函数中.我对这种方法并不是很疯狂,但是如果某人有一个干净而明智的方法来做到这一点,我就全都听见了.
另一种认为我是包裹dog在Backbone.Model.这可能很有趣,因为fetch并且save可以重新定义为find和/ insert或update,你也可以在那里定义你的所有行为,但我已经读过这种类型的东西通常是不鼓励的.
有没有正确的方法呢?是否有Meteor.Model正式的作品?其他人如何解决这个问题?
编辑
对于那些在接受答案后一年内提出这个问题的人:在编辑时我使用的是Exygy的minimongoid mrt包,它对haihappen版本有一些改进,这个版本在博客文章中提到的链接被接受的答案.
我目前正在为存储库做贡献,使结果集更像关系.希望其他人可以使用它,并倾向于提供有用的功能.
编辑
另一个答案建议transform在创建集合时使用该属性.虽然我肯定更喜欢我自己并不需要自己构建的东西,但这个功能增加了很多可能性,我希望任何正在研究ORM for Meteor的团队都会利用这个核心优势. .
这是一篇博客文章,解释了如何使用该transform属性.
此外,minimongoid现在可用作Meteor包,我仍在使用它.它支持验证和声明关系.我已经为这个软件包添加了一些功能,所以如果一个电路板有很多部分,board.pieces().create(attributes)将保留一个piece给定的新记录attributes并自动关联board.在我看过的各种解决方案中,这似乎是最全面的.
Fla*_*ken 28
您可以使用transformCollection中的参数来使用自定义函数重载对象
var Dogs = new Meteor.Collection("dogs",
{
transform:function(entry)
{
entry.bark = function(){ console.log(this.barkSound);};
return entry;
}
});
Run Code Online (Sandbox Code Playgroud)
然后:
var aDogID = new Dogs.insert({barkSound: "ruff"})
Dogs.find(aDogID).bark(); // "ruff"
Run Code Online (Sandbox Code Playgroud)
额外奖励:如果出于任何原因您想使用Andrew Ferk提出的类似概念,只需使用_.defaults(object,*defaults)函数即可.
var defaults = {
barkSound: "ruff",
bark: function() {
console.log(this.barkSound);
}
}
Dogs = new Meteor.Collection("dogs",
{
transform: function(object) {
return _.defaults(object, defaults);
}
});
Run Code Online (Sandbox Code Playgroud)
虽然官方模型系统可能正在开发中,但您现在可以做一些事情:
Mario Uhler 有一个类似 activerecord 的文档,而且非常好,在 CoffeeScript 中:https://coderwall.com/p/_q9b1w
还有一个由 Tom Coleman 制作的社区包,对模型非常有帮助:https://github.com/tmeasday/meteor-models,您可能需要Meteorite将其添加为包。
当然,正如您建议的 Backbone。我个人使用js原型,但并不是每个人都对它们感到满意,我只是使用它们,这样当流星的模型系统出来时它很容易过渡,它也很容易在客户端和服务器之间共享,而不需要添加太多包。
| 归档时间: |
|
| 查看次数: |
5445 次 |
| 最近记录: |