【问题标题】:meteor how to define class level methods?流星如何定义类级别的方法?
【发布时间】:2015-05-18 12:46:36
【问题描述】:

我有一个名为“文章”的集合。每篇文章都有一个类别。我想要一个全局变量,它是一个数组,在我的 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() 时,结果是“未定义”。

我做错了什么?

编辑:

我想这样做是因为我希望我的文章类别在网站上随处可见。

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

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

【问题讨论】:

    标签: meteor


    【解决方案1】:

    A Meteor.method will always return undefined on the client(除非存在模拟/存根并且在另一个父方法中调用它)所以这种行为是预期的。

    我不知道为什么在这个特定的用例中你需要Meteor.method,你不能把你的方法代码复制到你的类方法中吗?

    编辑:

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

    然后只需在您的 Articles 集合中使用外键即可。

    另一个好处是您的类别访问客户端将是被动的,这与使用Meteor.method相反。

    无论是 Telescope 还是 Wordpress,我都认为这种模式非常流行。

    【讨论】:

    • 我建议在我的最新编辑中转换模型架构。
    • 这是真的,但需要更多维护。我最终在模板级别创建了助手(无论如何我都需要这样做)。它们是反应性的。我希望有另一种方法可以从服务器发布同一集合的不同视图。
    【解决方案2】:

    看看这个包:

    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
            );
        }
    });
    

    【讨论】:

    • 据我所知,collection-helpers 在实例级别工作,而不是在集合级别。所以这对我不起作用。请注意,我编辑了问题以使我的目标更加明确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多