1

次のrouter.jsを取得しました:

define(['jquery', 'underscore', 'backbone', 'views/settings/index'], function($, _, Backbone, SettingsView) {

    var Router = Backbone.Router.extend({

        container: $('div.main'),

        routes: {
                "settings": "settings"
                , "settings/:query": "settings"
        },

        settings: function(query) {
            this.container.html(SettingsView.render().el);
        }

    });

    if (Router._instance) return Router._instance;

    Router._instance = new Router();

    return Router._instance;

});

ルーターは、requirejs 構成で最初の依存関係としてマークされている main.js ファイルで呼び出されます。

define(['jquery', 'underscore', 'backbone', 'router'], function($, _, Backbone, router) {

    // ajax settings (sent cors cookies)
    $.ajaxSetup({ xhrFields: { withCredentials: true } });

    // register master router
    window.router = router;

    // start backbone history
    Backbone.history.start({ root: "/" });          

});

いくつかのビューで、私は今やりたい:

define(['jquery', 'underscore', 'backbone', 'router'], function($, _, Backbone, router) {

    var View = Backbone.View.extend({

        initialize: function() {
            router.on('route:settings', this.change, this);
        },

        change: function(query) {
            // load some new content for example
        }

    });

    return View;

});

このエラーメッセージが表示されるよりも:

Uncaught TypeError: Cannot call method 'on' of undefined 

更新: 各モジュールに console.log を追加しました。したがって、モジュールが実行される順序はわかります。requirejs の順序が間違っていると言いました。

view.js -> main.js -> router.js

それ以外の:

router.js -> main.js -> view.js

これを解決する方法を見てみましょう

更新 2: ルーター イベント バインディング部分を setTimeout ループにラップしました。

        setTimeout(function() {
            window.router.on('route:settings', this.select, this);        
        }.bind(this), 20);

そして、それが機能することを確認してください!

これは本当に単なる修正ですが、それでも修正です:)

4

3 に答える 3

1

ルーターにシングルトン インスタンスを作成しようとしているのはなぜですか?

Requirejs は、私が理解している限り、適切なモジュール ローダーから期待できる限り、すべてのモジュールを 1 回だけ解決します。

#router.js
define(['jquery', 'underscore', 'backbone', 'views/settings/index'], 
  function($, _, Backbone, SettingsView) {
  //your code omitted ...

  //no need to do this
  //if (Router._instance) return Router._instance;
  //Router._instance = new Router();
  //return Router._instance;

  //this should work as well and give you a "singleton" instance
  return new Router();

});

于 2012-09-01T14:03:55.650 に答える
1
  1. requirejs.config() に指定した名前/パスが正しいかどうかを確認してください。少しタイプミスがあったので、何度か壁にぶち当たりました。このような場合、requirejs はエラーを返しませんが、残念ながら未定義のみです。
  2. タイプミスがないと確信している場合は、ビューの定義への明示的な依存関係として main.js を含めてみます。
于 2012-09-01T14:11:30.867 に答える
0

Router最初のの最後にオブジェクトへの参照を返す必要があると思いますdefine

define(['jquery', 'underscore', 'backbone', 'views/settings/index'], function($, _, Backbone, SettingsView) {

    var Router = Backbone.Router.extend({

        container: $('div.main'),

        routes: {
            "settings": "settings"
            , "settings/:query": "settings"
        },

        settings: function(query) {
            this.container.html(SettingsView.render().el);
        }

    });

    var Singletonizer = function(Singleton) {
        if (Singleton._instance) return Singleton._instance;

        Singleton._instance = new Singleton();

        Singletonizer(Singleton);
    };

    return Singletonizer(Router);
});
于 2012-08-31T17:09:13.530 に答える