1

更新:最初の回答とわずかに同じ解決策を見つけました。しかし実際には、 RequireJS を使用して、ビューで特別な var またはパラメーターを使用せずにそれを行う方法があるかどうかを知りたいです。ここに私の解決策があります:

define(['resthub', 'backbone', 'views/myModule/parent-view', 'views/myModule/a-view'],
function(Resthub, Backbone, ParentView, AView) {

    var ParentView = Backbone.View.extend({

        // Stuff before

        buildAView : function(aViewObject){
            var aView = aViewObject || AView;

            // Enought source code before and after those following lines
            // that I don't want to duplicate in ChildView
            this.aView = new aView();
            this.aView.render();
        }

        // Stuff after

    });

    return ParentView;
});

コードの重複を避けるために依存関係が RequireJS によって管理されるバックボーン プロジェクトで最大限の継承を使用しようとしています。実際、ベース ビューを拡張する新しいビューを作成します。ベース ビューには、オーバーライドしたい依存関係があります。しかし、オーバーライドしようとしても、新しい依存関係ではなく、元の依存関係が取得されます。私は継承を余儀なくされていることに注意してください。

ここで私がやろうとしていること:

私が継承するベースビュー:

define(['resthub', 'backbone', 'views/myModule/parent-view', 'views/myModule/a-view'],
function(Resthub, Backbone, ParentView, AView) {

    var ParentView = Backbone.View.extend({

        // Stuff before

        buildAView : function(){
            // Enought source code before and after those following lines
            // that I don't want to duplicate in ChildView
            this.aView = new AView();
            this.aView.render();
        }

        // Stuff after

    });

    return ParentView;
});

次に、作成しようとします。私が欲しいのは、buildAView() 関数が、a-view と同じソース コードを含まない b-view の AView という新しい依存関係を取ることです。

define(['resthub', 'backbone', 'views/myModule/parent-view', 'views/myModule/b-view'],
function(Resthub, Backbone, ParentView, AView) {

    var ChildView = ParentView.extend({

        // Stuff before

        render: function() {

            ParentView.__super__.render.apply(this, []);

            /* some stuff inbetween*/

            this.buildAView();
        }

    });

    return ChildView;
});

ありがとう :)

4

1 に答える 1

0

問題は、AViewそれが注入された関数にバインドされているため、それを呼び出すときに、モジュールに注入された をbuildAView使用することです。しかし、問題を解決する簡単な方法があります。ビューのプロパティとして保存するだけです。AViewParentViewAView

define(['resthub', 'backbone', 'views/myModule/parent-view', 'views/myModule/a-view'],
function(Resthub, Backbone, ParentView, AView) {

    var ParentView = Backbone.View.extend({

        // Stuff before
        AView: AView,

        buildAView : function(){
            // Enought source code before and after those following lines
            // that I don't want to duplicate in ChildView
            this.aView = new this.AView();
            this.aView.render();
        }

        // Stuff after

    });

    return ParentView;
});

define(['resthub', 'backbone', 'views/myModule/parent-view', 'views/myModule/b-view'],
function(Resthub, Backbone, ParentView, AView) {

    var ChildView = ParentView.extend({

        // Stuff before
        AView: AView,

        render: function() {

            ParentView.__super__.render.apply(this, []);

            /* some stuff inbetween*/

            this.buildAView();
        }

    });

    return ChildView;
});
于 2013-08-19T18:32:56.533 に答える