2012-11-26 73 views
13

我一直希望在Meteor中使用繼承,但在文檔或Stack Overflow中找不到它。在meteor.js中使用繼承

有可能讓模板繼承另一個抽象模板或類的屬性和方法嗎?

+0

我爲流星創建了一個名爲'view'的[一個包](https://atmosphere.meteor.com/package/view)。我用它來包裝流星視圖和類似視圖類的主幹。也許你會在那裏找到一些想法。 – Andreas

回答

18

我認爲簡單的答案是否定的,但這裏有一個較長的答案:

一兩件事,我對我所做的模板之間共享功能是定義傭工的對象,然後將其分配給多個模板,像所以:

var helpers = { 
    displayName: function() { 
     return Meteor.user().profile.name; 
    }, 
}; 

Template.header.helpers(helpers); 
Template.content.helpers(helpers); 

var events = { 
    'click #me': function(event, template) { 
     // handle event 
    }, 
    'click #you': function(event, template) { 
     // handle event 
    }, 
}; 

Template.header.events(events); 
Template.content.events(events); 

這不是繼承,而是它確實可以讓你在模板之間共享功能。

如果你希望所有的模板有機會獲得一個幫手,你可以定義一個全局幫手,像這樣(見https://github.com/meteor/meteor/wiki/Handlebars):

Handlebars.registerHelper('displayName',function(){return Meteor.user().profile.name;}); 
+0

這非常有用。謝謝。如何擴展事件?那裏有任何想法? – Gezim

+0

我有點同樣不完全令人滿意的結論.. –

+0

@Pilgrim我也爲事件添加了一些例子。 – zorlak

2

我已經回答了這個問題here。雖然該解決方案不使用inheritance,但它允許您輕鬆地跨模板共享事件和助手。

概括地說,我定義一個extendTemplate功能,這需要在一個模板,並與助手和活動的對象作爲參數:

extendTemplate = (template, mixin) -> 
    helpers = ({name, method} for name, method of mixin when name isnt "events") 
    template[obj.name] = obj.method for obj in helpers 

    if mixin.events? 
    template.events?.call(template, mixin.events) 

    template 

欲瞭解更多信息和實例看我other answer

+0

最佳答案,在OOP中,建議你使用「繼承的組合」,這個答案有利於前者。 –

1

最近,我需要在我的應用程序中具有相同的功能,所以我決定創建我自己的包,它將開箱即可完成這項工作。雖然它仍在進行中,但您可以放棄它。

基本上,整個方法如下:在您要擴展抽象的

// Defines new method /extend 
Template.prototype.copyAs = function (newTemplateName) { 
    var self = this; 

    // Creating new mirror template 
    // Copying old template render method to keep its template 
    var newTemplate = Template.__define__(newTemplateName, self.__render); 
    newTemplate.__initView = self.__initView; 

    // Copying helpers 
    for (var h in self) { 
     if (self.hasOwnProperty(h) && (h.slice(0, 2) !== "__")) { 
      newTemplate[h] = self[h]; 
     } 
    } 

    // Copying events 
    newTemplate.__eventMaps = self.__eventMaps; 

    // Assignment 
    Template[newTemplateName] = newTemplate; 
}; 

在您的新模板(new_template.js),寫入以下內容:

// this copies your abstract template to your new one 
Template.<your_abstract_template_name>.copyAs('<your_new_template_name>'); 

現在,你可以簡單地覆蓋你的幫手或事件(在我的情況下,它是幫助者photos),通過做如下:

​​3210

您將引用覆蓋的幫助程序方法並提取未被覆蓋的方法。

請注意,新模板的HTML文件不是必需的,因爲我們一直提到抽象的文件。

源代碼在Github上可用here