2012-11-26 51 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