在面向对象的风格中使用流星和JavaScript

问题描述:

请耐心等待我,因为我是JS的新手,并且在使用Meteor执行某些操作时遇到了麻烦。我实现了一类在JavaScript中使用在面向对象的风格中使用流星和JavaScript

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

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

+0

不能使用类的方法。当你使用'Meteor.call'流星将你的params序列化为json并发送那个json。由于范围的原因,不能将函数序列化为json。 – nepjua 2013-11-10 18:39:34

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

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

我对流星一无所知,但是我发现你的代码有问题。你错过了一个分号后:

this.property = 0 

没有这个分号,JavaScript解释器将不会执行this.method分配。

+2

这是javascript。分号不是必需的。 – Adgezaza 2012-07-18 13:36:57

+1

分号是绝对必要的。通过jslint运行你的代码。添加下面的选项来忽略严格并在浏览器中运行。你需要一个分号。可能为什么你的代码没有运行。 – Geuis 2012-07-19 04:31:11

+0

我同意让分号为良好的做法,但仍然不需要。这是来自jslint(我不确定是否是一个好工具,您的浏览器控制台可能是一个更好的测试工具)“JavaScript尝试使用分号插入机制来使这些分号可选。” – Adgezaza 2012-07-19 17:51:54

这不是一个真正的答案,但在流星的包管理器中,您可以添加如backbone.js这样的库,为您提供模型,集合和视图以及一个很好的路由器,我在制作流星应用时非常方便。主干与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" 

这种做法精美的工作对我来说:

http://www.okgrow.com/posts/2014/05/19/meteor-transform/

我一直在寻找做同样的事情。

我发现了一个名为“变换”的函数,当从流星集合中获取某些东西时会调用它。您可以使用它来根据需要添加一个函数到流星对象。

这里是增加一个“结束日期”功能和“剩余”的功能流星对象

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

在这里阅读更多的例子:如果您发送Class`你的`实例 http://www.okgrow.com/posts/2014/05/19/meteor-transform/