在面向对象的风格中使用Meteor和javascript

时间:2012-07-18 07:27:09

标签: javascript meteor

请耐心等待我,因为我是JS的新手并且在使用Meteor实现某些功能时遇到了麻烦。我使用

在JavaScript中实现了一个类
function Class() {
  this.property = 0
  this.method = function () {
  return "method called"
  }
}

我使用新的Meteor.collection创建了一个新的Meteor Collection,并成功检索了客户端上的数据,并可以在html模板中显示Class.property。但是,我无法访问Class.method并且想知道是否有任何方法可以实现这一点,并且如果使用Meteor.methods定义以Class实例作为输入的函数是最好的方法。

5 个答案:

答案 0 :(得分:3)

对于仍然在看这个的人来说,代码不起作用的原因是因为mongodb将文档存储为bson。 bson,就像json一样,不支持函数(http://bsonspec.org)所以当上面的类被meteor保存到mongo中时,该方法不会保存为文档的一部分。

我知道没有简单优雅的解决方案。我有同样的问题。为了利用类方法,您需要在每次需要时实例化该类,您可以将其作为数据库模型的一部分来实现。

答案 1 :(得分:1)

这不是一个真正的答案,但在meteor的软件包管理器中你可以添加像backbone.js这样的库,它可以为你提供模型,集合和视图以及一个很好的路由器,在制作流星应用程序时我觉得非常方便。 Backbone与jQuery配合良好。

我的另一个建议是使用类似Mootools的库,与jQuery不同,它不会尝试改变你编写javascript的方式,而是增强了制作面向对象的javascript的体验。 (见:jqueryvsmootools)。使用mootools,您可以通过以下方式制作课程......

var MyClass = new Class({
    'Implements': [Options],

    //default options
    'options': {
        'foo': null
    },

    'initialize': function(options) {
        this.foo = options.foo;
    },

    'bar' : function() {
       return this.foo;
    }
});

var blub = new MyClass({'foo': 'Hello World'});
blub.bar(); // "Hello World"

答案 2 :(得分:1)

我当时也想做同样的事情。

我找到了一个名为" transform"从流星集合中获取内容时调用。您可以使用它根据需要将功能添加到流星对象。

以下是添加" endDate"的示例。功能和"剩余"函数到流星对象

Products = new Meteor.Collection("Products", {
  transform: function (doc) {
    doc.endDate = function () {
      // SugarJS gives us minutesAfter() which gives us a nice syntax for
      // creating new Date objects
      // http://sugarjs.com/api/Number/unitAfter
      return ((25).minutesAfter(this.startDate));
    };
    doc.remaining = function () {
      return this.endDate().getTime() - Date.now();
    };
    return doc;
  }
});

在这里阅读更多内容: http://www.okgrow.com/posts/2014/05/19/meteor-transform/

答案 3 :(得分:0)

答案 4 :(得分:-2)

我对Meteor一无所知,但我发现您的代码存在问题。你之后错过了分号:

this.property = 0

如果没有这种分号,javascript解释器将不会执行this.method赋值。