2

基本的なBackbone.jsルーター宣言をTypeScriptに変換しようとしています。

var AppRouter = Backbone.Router.extend({
    routes: {
        "*actions": "defaultRoute"
    },

    defaultRoute: function () {
        document.write("Default Route Invoked");
    }
});

var app_router = new AppRouter();

Backbone.history.start();

私の変換したコードは次のとおりですが、機能しません。

class AppRouter extends Backbone.Router {
    routes = {
        "*actions": "defaultRoute"
    }

    defaultRoute() {
        document.write("Default Route Invoked");
    }
}

var app_router = new AppRouter();

Backbone.history.start();

コンパイル時または実行時エラーは発生しませんが、コードが機能しません。なんで?

4

4 に答える 4

2

Steve Fentonが述べたように、Typescriptsextendはアンダースコア/backonesextendメソッドと同じようには機能しないためです。

主な問題は、タイプスクリプト階層の「サブクラス」にルートフィールドが設定される前に、ルーターが_bindRoutes()を呼び出すことです。

oradで説明されているようにtsクラスのコンストラクターでBackbone.Router.apply(this、arguments)を呼び出すと、 routesフィールドが設定された後にこの呼び出しが行われるようになります。

この関数を手動で呼び出すと、このトリックも実行されます。

参考までに:要素からのDOMイベントをトリガーする場合は、ビュークラスのコンストラクターでdelegateEvents(this.events)を呼び出します。

于 2013-02-11T10:52:41.770 に答える
2

私が見てきたのですがBackbone.Router.extends、これは基本的なプロトタイプ拡張機能ではありません。そのBackbone.Router.extendsため、TypeScriptクラス拡張機能に切り替えることはできません。

TypeScriptファイルを元のJavaScriptのように変更します。これでも、インテリセンスと型チェックのメリットを享受できます。クラスを使用していないだけです。

var AppRouter = Backbone.Router.extend({
    routes: {
        "*actions": "defaultRoute"
    },

    defaultRoute: function () {
        document.write("Default Route Invoked");
    }
});

var app_router = new AppRouter();

Backbone.history.start();
于 2013-01-30T10:34:27.760 に答える
2

初期化されたすべてのフィールドをコンストラクターに追加superし、最後にを呼び出します。

class AppRouter extends Backbone.Router {

    routes: any;
    constructor(options?: Backbone.RouterOptions) {

        this.routes = {
            "*actions": "defaultRoute"
        }

        super(options);
    }

    initialize() {
        // can put more init code here to run after constructor
    }

    defaultRoute() {
        document.write("Default Route Invoked");
    }
}

var app_router = new AppRouter();

Backbone.history.start();
于 2013-02-05T03:17:47.987 に答える
0

受け入れられた答えはtypescript3.xでは機能しないようです。を使用する前に、super()メソッドを呼び出す必要がありますthissuper()バックボーンがメソッド内のルートを初期化しているため、コードの並べ替えは機能しません。これは、ルート構成がに直接渡されるバージョンsuper()です。

class AppRouter extends Backbone.Router {

    constructor() {

        super({
            routes: {
                "*actions": "defaultRoute"
            }
        });
    }
}
于 2019-04-30T06:50:25.957 に答える