Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以面向对象的方式使用Meteor和javascript_Javascript_Meteor - Fatal编程技术网

以面向对象的方式使用Meteor和javascript

以面向对象的方式使用Meteor和javascript,javascript,meteor,Javascript,Meteor,请容忍我,因为我是JS新手,在使用Meteor实现某些东西时遇到了困难。我使用JavaScript实现了一个类 function Class() { this.property = 0 this.method = function () { return "method called" } } 我使用new Meteor.Collection创建了一个新的Meteor Collection bu,并成功地在客户端检索到数据,并且可以在html模板中显示Class.propert

请容忍我,因为我是JS新手,在使用Meteor实现某些东西时遇到了困难。我使用JavaScript实现了一个类

function Class() {
  this.property = 0
  this.method = function () {
  return "method called"
  }
}

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

我对Meteor一无所知,但我发现您的代码有问题。您在以下情况下缺少分号:

this.property = 0

如果没有分号,javascript解释器将无法执行this.method分配。

这不是一个真正的答案,但在meteor的软件包管理器中,您可以添加库,这样可以为您提供模型、集合和视图,以及一个我觉得在制作meteor应用程序时非常方便的漂亮路由器。主干网可以很好地与用户交互

我的另一个建议是使用类似于jQuery的库,它不会试图改变编写javascript的方式,而是增强制作面向对象javascript的体验。(见:)。使用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"

对于仍然关注这一点的人来说,代码不起作用的原因是mongodb将文档存储为bson。与json一样,bson不支持函数(),因此当meteor将上述类保存到mongo中时,该方法不会保存为文档的一部分


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

这种方法对我来说非常有效:


我想做同样的事情

我发现了一个名为“transform”的函数,当从meteor集合中获取某些内容时会调用该函数。您可以根据需要使用它向meteor对象添加函数

下面是一个向meteor对象添加“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;
  }
});
请在此处阅读更多信息:

这是javascript。分号是不必要的。分号是绝对必要的。通过jslint运行代码。在其下方添加选项以忽略strict并在浏览器中运行。你需要一个分号。可能是您的代码没有运行的原因。我同意分号有助于良好的实践,但仍然不需要。这是来自jslint(我不确定它是否是一个好工具,您的浏览器控制台可能是一个更好的测试工具)“JavaScript试图通过分号插入机制使这些分号成为可选的。”。尝试创建返回值为“hi”的函数\n;“hi”不会被返回。@Ameen——这就是我说的如果你发送一个
Class
的实例,你就不能使用Class的方法。当您使用Meteor.call时,Meteor将您的参数序列化为json并发送该json。由于作用域的原因,无法将函数序列化为json。