1

注:これはバックボーンとは何の関係もないため、検索性を高めるために回答後のタイトルを変更しました。

 module App.BackBone.Collections {  
     export class MixedChartCollection extends Backbone.Collection {        
            public model: App.BackBone.Models.BaseChartModel;        
            constructor(models?: any, options?: any) {
                  super(models, options);
            }
       }
}

ベースの Backbone.Collection コンストラクターが呼び出され、thisコンテキストが私のクラス o_O ではなく私のモジュールになっているようです

backbone.js のコンストラクターは次のとおりです。

 var Collection = Backbone.Collection = function (models, options) {
      options || (options = {});
      if (options.url) this.url = options.url;
      if (options.model) this.model = options.model;
      if (options.comparator !== void 0) this.comparator = options.comparator;
      this._reset();  //ERROR: this._reset is not a function
      this.initialize.apply(this, arguments);
      if (models) this.reset(models, _.extend({ silent: true }, options));
  }; 

画像でApp.BackBone.Collectionsは、同じ 3 つのメンバー (赤色で表示され、そのうちの 1 つは問題のクラス) がthisコンテキストとしてどのように使用されているかを確認できます。 this._reset は最終的に未定義になります。どこからともなくオブジェクト

なぜこれを行うのですか?

このクラスのコンパイル済みコードは次のとおりです。

var App;
(function (App) {
    (function (BackBone) {
        (function (Collections) {
            var MixedChartCollection = (function (_super) {
                __extends(MixedChartCollection, _super);
                function MixedChartCollection(models, options) {
                    _super.call(this, models, options); //HERE "this" is not MixedChartCollection instance 
                }
                return MixedChartCollection;
            })(Backbone.Collection);
            Collections.MixedChartCollection = MixedChartCollection;            
        })(BackBone.Collections || (BackBone.Collections = {}));
        var Collections = BackBone.Collections;
    })(App.BackBone || (App.BackBone = {}));
    var BackBone = App.BackBone;
})(App || (App = {}));          

ここに画像の説明を入力

4

2 に答える 2

2

BaseChartModel が次のように宣言されていると仮定します。

module App.Backbone.Models {
    export class BaseChartModel extends Backbone.Model {

    }
}

そしてあなたの MixedChartCollection:

module App.Backbone.Collections {
    export class MixedChartCollection extends Backbone.Collection {
        public model: App.Backbone.Models.BaseChartModel;
        constructor(models?: any, options?: any) {
            super(models, options);
        }
    }
}

私が見る重要な問題の 1 つは、名前空間に and が含まれているという事実BackboneですBackbone。これらを JavaScript に変換すると、次のようになります。

var App;
(function (App) {
    (function (Backbone) {
        (function (Models) {
            var BaseChartModel = (function (_super) {
                __extends(BaseChartModel, _super);
                function BaseChartModel() {
                    _super.apply(this, arguments);

                }
                return BaseChartModel;
            })(Backbone.Model);
            Models.BaseChartModel = BaseChartModel;            
        })(Backbone.Models || (Backbone.Models = {}));
        var Models = Backbone.Models;
    })(App.Backbone || (App.Backbone = {}));
    var Backbone = App.Backbone; // << scope chain now includes Backbone
})(App || (App = {}));
var App;
(function (App) {
    (function (Backbone) {
        (function (Collections) {
            var MixedChartCollection = (function (_super) {
                __extends(MixedChartCollection, _super);
                function MixedChartCollection(models, options) {
                    _super.call(this, models, options);
                }
                return MixedChartCollection;
            })(App.Backbone.Collection);
            Collections.MixedChartCollection = MixedChartCollection;            
        })(Backbone.Collections || (Backbone.Collections = {}));
        var Collections = Backbone.Collections;
    })(App.Backbone || (App.Backbone = {}));
    var Backbone = App.Backbone;  // << scope chain now includes Backbone
})(App || (App = {}));

が(生成されたコードの最後の行から 2 番目の行) にBackbone設定されている場所で競合が発生することがわかります。App.Backbone

var Backbone = App.Backbone; // << scope chain now includes Backbone

これにより、BackboneJSクラスBackboneではなく、ローカル スコープのインスタンス値に対して継承が行われるようになるため、コードの性質が完全に変わります (クラスについても同様です)。ModelCollection

コレクションとモデル クラスに Backbone 名前空間を使用しないようにモジュール宣言を変更してみてください。

module App.My.Models {
    export class BaseChartModel extends Backbone.Model {

    }
}

module App.My.Collections {
    export class MixedChartCollection extends Backbone.Collection {
        public model: App.My.Models.BaseChartModel;
        constructor(models?: any, options?: any) {
            super(models, options);
        }
    }
}
于 2013-03-30T14:42:30.327 に答える