Meteorで継承を使用したいと思っていましたが、ドキュメントやStackOverflowで継承について何も見つかりませんでした。
別の抽象テンプレートまたはクラスからプロパティとメソッドを継承するテンプレートを持つことは可能ですか?
Meteorで継承を使用したいと思っていましたが、ドキュメントやStackOverflowで継承について何も見つかりませんでした。
別の抽象テンプレートまたはクラスからプロパティとメソッドを継承するテンプレートを持つことは可能ですか?
短い答えはノーだと思いますが、長い答えは次のとおりです。
テンプレート間で機能を共有するために私が行ったことの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;});
私はここでこの質問に答えました。このソリューションはを使用しませんが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
詳細と例については、他の回答を参照してください。
最近、アプリに同じ機能が必要だったので、箱から出してその仕事をする独自のパッケージを作成することにしました。まだ作業中ですが、試してみることができます。
基本的に、全体の方法は次のとおりです。
// 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
ヘルパー)を上書きすることができます。
Template.<your_new_template_name>.photos = function () {
return [];
};
上書きされたヘルパーメソッドと、上書きされていない抽象メソッドを参照します。
常に抽象テンプレートを参照するため、新しいテンプレートのHTMLファイルは必要ないことに注意してください。
ソースコードはGithubのこちらから入手できます!