3

私は大きなバックボーン アプリケーションで立ち往生しています。

メインアプリケーション内でさまざまなアプリケーションを実行しています。そして、アプリとルートを非同期で大きなアプリに追加したいと考えています。

ここで行うことは、主要なアプリが読み込まれた後に、Require.JS を使用してさまざまなアプリを非同期的に追加することです。新しいルートをメイン ルーティングに追加するには、履歴を停止して新しいルートを追加し、履歴を再度開始します。これは機能しますが、大きな欠点が 1 つあります。(app.navigate('x',true);) に行くたびに、新しい既存のパスが、history.started の回数だけルーティングを開始します。また、すべてのビューがレンダリングされます。

これにより、アプリの速度が大幅に低下し、完全に非効率的です。

history.stop/start を使用せずに新しいルートを動的に追加する方法はありますか?

4

2 に答える 2

3

Backbone.history新しいルートを追加するたびに停止/開始する必要はありません。バックボーンはrouter.route、新しいルーターを呼び出すか作成するときにその状態を変更します。

したがって、ルートを手動でルーターに追加します。

var R = Backbone.Router.extend({
    routes: {
    }
});

var r = new R();
Backbone.history.start();

r.route('added', 'added', function() {
    console.log('added : '+window.location.hash);
});

または新しいルーターをインスタンス化する

var R = Backbone.Router.extend({
  routes: {
  }
});

var r = new R();
Backbone.history.start();

var R2 = Backbone.Router.extend({
    routes: {
        'added': 'added'
    },
    added: function() {
        console.log('added: '+window.location.hash);
    }
});
var r2 = new R2();

そしてデモ

var R = Backbone.Router.extend({
  routes: {
    "help": "help"
  },
  help: function() {
      console.log('help : '+window.location.hash);
  }
});


var r = new R();
Backbone.history.start();
r.navigate('help', {trigger: true});


var R2 = Backbone.Router.extend({
  routes: {
    "r2": "r2"
  },
  r2: function() {
    console.log('r2 : '+window.location.hash);
  }
});
var r2 = new R2();
r2.navigate('r2', {trigger: true});


r.route('added', 'added', function() {
    console.log('added : '+window.location.hash);
});

r.navigate('added', {trigger: true});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>

<a href='#help'>help</a>
<a href='#r2'>r2</a>
<a href='#added'>added</a>

于 2012-10-18T13:58:06.510 に答える
0

ルーターを含む小さな .js ファイルを作成しました。さまざまな目的で使用できるはずなので、必要なコールバック (ルート) を init に渡すことができます。init は、次の情報を保持するパラメーター routes (配列) を取ります。

routeId:"book/:id",
routeName:"routeBooks",
routeCallback: $.proxy(function(id){ 
 // $.proxy() is a jQuery function that ensures you call the callback in the right context
      // do fandy stuff here.
})

ルートを解析するには、次を使用します。

for( route in routes ){
    routesFromConfig[routes[route].routeId.toString()] = routes[route].routeName;
}
var ModalRouter = Backbone.Router.extend({
    routes:routesFromConfig
});
router = new ModalRouter();
for( route in routes ){
    // test if the callback is a function
    if(_.isFunction(routes[route].routeCallback)){
        router.on('route:'+routes[route].routeName.toString(), routes[route].routeCallback);
    }
}

Backbone.history.start();

これが、アプリの別の場所から渡されたルートからルーターを設定するのに役立つことを願っています

于 2013-07-03T23:57:13.123 に答える