meteor如何定义类级方法?

时间:2015-05-18 12:46:36

标签: meteor

我有一个名为" Articles"的集合。每篇文章都有一个类别。我希望有一个全局变量是一个数组,在我的文章集合中包含每个不同的类别值。

我试着这样做:

/models/article.coffee:

@Articles = new Meteor.Collection"文章"

Articles.categories = ->
  Meteor.call "articleCategories", (e, r) ->
    unless e
      return r

/server/article_server.coffee:

Meteor.methods
  articleCategories: ->
    categories = _.uniq(Articles.find({}, {sort: {category: 1}, fields:
        {category: true}}).fetch().map (x) ->
        x.category
    , true)
    return categories

这不起作用。结果是"未定义"当我从控制台调用Articles.categories()时。

我做错了什么?

编辑:

我想这样做,因为我希望我的文章类别可以在网站的任何地方使用。

由于文章集合不会在每个页面上发布,我认为,我可以生成一个阵列服务器端并将其传递给客户端。

但也许这不是一个好主意......

2 个答案:

答案 0 :(得分:1)

A Meteor.method will always return undefined on the client(除非存在模拟/存根,并且在另一个父方法中调用它),因此预期会出现此行为。

我不确定为什么在这个特定的用例中你需要Meteor.method,你不能只是在方法中复制你的方法代码吗?

编辑:

为了完成您想要做的事情,我建议您更改模型以创建一个填充了所有可能类别的Categories集合,然后将整个内容发布到客户端。

然后只需在Articles集合中使用外键。

与使用Meteor.method相反,您的类别访问客户端将具有反应性,这将带来额外的好处。

无论是Telescope还是Wordpress,我认为这种架构非常受欢迎。

答案 1 :(得分:0)

看看这个包裹:

https://github.com/dburles/meteor-collection-helpers

在你的模型中添加这样的东西(我用javascript编写):

Articles.helpers({
    categories: function(){
        return _.uniq(
           _.pluck(Articles.find({}, {sort: {category: 1}, fields:
               {category: true}}).fetch(), 'category'),
           true
        );
    }
});