Подтвердить что ты не робот

Использование наследования в meteor.js

Я надеялся использовать наследование в Meteor, но я не мог найти ничего об этом в документации или в Stack Overflow.

Возможно ли иметь шаблоны, наследующие свойства и методы из другого абстрактного шаблона или класса?

4b9b3361

Ответ 1

Я думаю, что короткий ответ - нет, но здесь более длинный ответ:

Одна вещь, которую я сделал для обмена функциональностью между шаблонами, - это определить объект помощников, а затем назначить его нескольким шаблонам, например:

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

Ответ 2

Я ответил на этот вопрос здесь. Хотя решение не использует 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

Более подробную информацию и пример см. в моем другом ответе.

Ответ 3

Недавно мне понадобилась такая же функциональность в моем приложении, поэтому я решил создать свой собственный пакет, который будет делать эту работу из коробки. Несмотря на то, что он все еще работает, вы можете уйти.

В принципе, весь метод выглядит следующим образом:

// 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 helper), выполнив следующие действия:

Template.<your_new_template_name>.photos = function () {
    return [];
};

Вы будете ссылаться на перезаписанные вспомогательные методы и на абстрактные, которые не перезаписываются.

Обратите внимание, что HTML файл для нового шаблона не нужен, так как мы все время ссылаемся на абстрактное.

Исходный код доступен в Github здесь!