Использование наследования в meteor.js
Я надеялся использовать наследование в Meteor, но я не мог найти ничего об этом в документации или в Stack Overflow.
Возможно ли иметь шаблоны, наследующие свойства и методы из другого абстрактного шаблона или класса?
Ответы
Ответ 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 здесь!