2012-07-18 14 views
3

請耐心等待我,因爲我是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

回答

3

對於任何人仍在尋找這個,代碼不起作用的原因是因爲MongoDB中存儲文檔的BSON。 bson,就像json一樣,不支持函數(http://bsonspec.org),所以當上面的類被meteor保存爲mongo時,該方法不會保存爲文檔的一部分。

我沒有想到的簡單優雅的解決方案。我有同樣的問題。爲了利用類方法,您需要在每次需要時實例化類,這可以作爲數據庫模型的一部分實現。

-2

我對流星一無所知,但是我發現你的代碼有問題。你錯過了一個分號後:

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

1

這不是一個真正的答案,但在流星的包管理器中,您可以添加如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" 
1

我一直在尋找做同樣的事情。

我發現了一個名爲「變換」的函數,當從流星集合中獲取某些東西時會調用它。您可以使用它來根據需要添加一個函數到流星對象。

這裏是增加一個「結束日期」功能和「剩餘」的功能流星對象

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/