8

これは私の app.js ファイルです。クラスのメソッドnavigate内からルーターのメソッドにアクセスする必要があります。しかし、appRouter はビューの後に定義されているため、ビュー内からルーターを認識できません。そのため、任意のクラスまたはメソッドからルーターにグローバルにアクセスする方法を見つける必要があります。どうすればこの問題を回避できますか?navigateToLoginLandingView

var LandingView = Backbone.View.extend({
    tagName: 'div', 
    id: 'landing',
    className: 'landingpad',
    events: {
        'click button#login': 'navigateToLogin',
    },
    render: function (){

        (this.$el).append("<button class='button' id='login'>Login</button><br/><br/><br/>");
        (this.$el).append("<button class='button' id='new'>New User?</button>");

        console.log(this.el);
        return this;
    },
    navigateToLogin: function(e){
        app.navigate("/login", true);
        return false; 
    },
});

var appRouter = Backbone.Router.extend({

initialize: function(){
    $('#content').html(new LandingView().render().el);
}
});

    app = new appRouter();
4

2 に答える 2

20

Backbone のコードを少し掘り下げると、ルーターの の実装が次のnavigateように呼び出していることに気付くでしょうBackbone.history.navigate

// Simple proxy to `Backbone.history` to save a fragment into the history.
navigate: function(fragment, options) {
  Backbone.history.navigate(fragment, options);
}

したがって、グローバルスコープを明示的にいじる代わりに、次を使用しますBackbone.history.navigate

var LandingView = Backbone.View.extend({
    ...
    navigateToLogin: function(e){
        Backbone.history.navigate("/login", true);
        return false; 
    },
});
于 2012-12-19T18:43:16.563 に答える
7

グローバルにアクセスできる必要appRouterがある場合は、グローバルオブジェクトにアタッチする必要があります。Webブラウザーでは、これがwindowオブジェクトです。

window.app = new appRouter();

そして、ウィンドウからアクセスします。

window.app.navigate(...);

グローバルを使用すると、コードの保守が困難になる可能性があります。アプリのサイズがそれほど大きくない場合は、メディエーターパターンなどのデカップリングメカニズムの使用を検討してください。

于 2012-12-19T13:21:21.323 に答える