13

Meteorで継承を使用したいと思っていましたが、ドキュメントやStackOverflowで継承について何も見つかりませんでした。

別の抽象テンプレートまたはクラスからプロパティとメソッドを継承するテンプレートを持つことは可能ですか?

4

3 に答える 3

20

短い答えはノーだと思いますが、長い答えは次のとおりです。

テンプレート間で機能を共有するために私が行ったことの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;});
于 2012-12-14T00:25:47.087 に答える
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

詳細と例については、他の回答を参照してください。

于 2013-03-24T17:34:37.670 に答える
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ヘルパー)を上書きすることができます。

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

上書きされたヘルパーメソッドと、上書きされていない抽象メソッドを参照します。

常に抽象テンプレートを参照するため、新しいテンプレートのHTMLファイルは必要ないことに注意してください。

ソースコードはGithubのこちらから入手できます!

于 2014-08-09T20:27:48.057 に答える