Javascript 在meteor.js中使用继承

Javascript 在meteor.js中使用继承,javascript,model-view-controller,inheritance,meteor,Javascript,Model View Controller,Inheritance,Meteor,我一直希望在Meteor中使用继承,但在文档或堆栈溢出中找不到任何关于它的信息 有没有可能让模板从另一个抽象模板或类继承属性和方法?我认为简短的答案是否定的,但这里有一个较长的答案: 为了在模板之间共享功能,我做了一件事,即定义一个helpers对象,然后将其分配给多个模板,如下所示: var helpers = { displayName: function() { return Meteor.user().profile.name; }, }; Templa

我一直希望在Meteor中使用继承,但在文档或堆栈溢出中找不到任何关于它的信息


有没有可能让模板从另一个抽象模板或类继承属性和方法?

我认为简短的答案是否定的,但这里有一个较长的答案:

为了在模板之间共享功能,我做了一件事,即定义一个helpers对象,然后将其分配给多个模板,如下所示:

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);
确切地说,这不是继承,但它确实使您能够在模板之间共享功能

如果希望所有模板都可以访问辅助对象,可以这样定义全局辅助对象(请参见):


我已经回答了这个问题。虽然解决方案不使用继承,但它允许您轻松地跨模板共享事件和帮助程序

简而言之,我定义了一个
extendTemplate
函数,该函数接收模板和一个对象,其中包含helpers和事件作为参数:

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

有关更多详细信息和示例,请参见my。

最近,我需要在我的应用程序中使用相同的功能,因此我决定创建自己的软件包,以便立即完成这项工作。虽然这项工作仍在进行中,但你可以试一试

基本上,整个方法如下:

// 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>');
Template.<your_new_template_name>.photos = function () {
    return [];
};
您将引用被覆盖的助手方法和未被覆盖的抽象方法

请注意,新模板的HTML文件不是必需的,因为我们一直在引用抽象模板


源代码可在Github上获得

我为meteor创建了名为
view
。我使用它包装流星视图,并使用类似主干的视图类。也许你会在那里找到一些想法,这是非常有用的。谢谢延长活动时间怎么样?有什么想法吗?@Pilgrim我也为活动添加了一些示例。为什么不直接使用
把手。registerHelper
?我要做的另一件事是有一个
索引
模板,其中添加了所有其他的-这允许我将事件添加到
模板.index.events
,并且它适用于整个系统page@Swadq那个索引模板是一种很酷的技术。至于为什么不使用Handlebars.registerHelper,这与Meteor首先有特定于模板的帮助程序,而不仅仅是全局帮助程序的原因是一样的:一般来说,最好不要用一组可能只应用于几个模板的方法来污染全局Handlebars命名空间。最好的答案是,在OOP中,建议您使用它“组合优先于继承”,这个答案支持前者。
Template.<your_new_template_name>.photos = function () {
    return [];
};