e7mac
e7mac

Reputation: 553

Using Meteor and javascript in an object oriented style

Please bear with me as I'm new to JS and am having trouble implementing some things with Meteor. I implemented a class in JavaScript using

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

I made a new Meteor Collection bu using new Meteor.collection and successfully retrieved the data on the client and can display Class.property in the html template. However, I am unable to access Class.method and was wondering if there's any way to make this happen and if using Meteor.methods to define functions that take the Class instance as input is the best way to go.

Upvotes: 3

Views: 4395

Answers (5)

Mc User
Mc User

Reputation: 33

I was looking to do the same thing.

I found a function called "transform" that is called when getting something from a meteor collection. You can use it to add a function to a meteor object just as you require.

Here is an example of adding an "endDate" function and "remaining" functions to a meteor object

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

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

Upvotes: 1

Laran Evans
Laran Evans

Reputation: 1313

This approach worked beautifully for me:

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

Upvotes: 0

lukenofurther
lukenofurther

Reputation: 563

For anyone still looking at this, the reason the code doesn't work is because mongodb stores documents as bson. bson, just like json, does not support functions (http://bsonspec.org) so when the above class is saved by meteor into mongo, the method is not saved as part of the document.

There is no easy elegant solution I'm aware of. I have the same issue. In order to utilise the class method you would need to instantiate the class each time you needed it, which you could implement as part of a database model.

Upvotes: 3

a11hard
a11hard

Reputation: 2054

This is not really an answer but in meteor's package manager you can add libraries like backbone.js which gives you models, collection and views and a nice router which I find very handy when making meteor apps. Backbone works well with jQuery.

My other suggestion is using a library like Mootools which unlike jQuery doesn't try to change the way you write javascript but enhancing the experience of making object oriented javascript. (see: jqueryvsmootools). With mootools you can can make a class the following way...

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"

Upvotes: 1

Geuis
Geuis

Reputation: 42277

I don't know anything about Meteor, but I see a problem with your code. You're missing a semi-colon after:

this.property = 0

Without that semi-colon, the javascript interpreter will not execute the this.method assignment.

Upvotes: -2

Related Questions