2012-04-27 9 views
3

私のコードは実行されません:BACKBONE.JSルータの初期化は、次のようにすぐに

var AppRouter = Backbone.Router.extend({ 

    _data: null, 
    _length: 0, 
    _index: null, 
    _todos: null, 
    _subtodolist: null, 
    _subtodos: null, 

    routes: { 
     "*action": "index", 
     "category/:name": "hashcategory" 
    }, 

    initialize: function(options){ 
     var self = this; 
     if (this._index === null){ 
      $.ajax({ 
       url: 'data/todolist.json', 
       dataType: 'json', 
       data: {}, 
       success: function(data) { 
        self._data = data; 
        self._todos = new TodosCollection(data); 
        self._index = new CategoriesView({collection: self._todos}); 
        //self._index.render(); 
       } 
      }); 
      return this; 
     } 
     return this; 
    }, 

    index: function(){ 
     this._index.render(); 
    }, 
.... 

をしかし、私が始めるとき、放火犯のコンソールパネルは常にthis._indexindex機能がnullである私に語りました。 $.ajax successコールバック関数の最後にself._index.render()を使用してホームページをレンダリングする必要があります(上でコメントアウトしています)。 関数がinitialize関数の前に実行されているようです。それはどうやって解決できますか?

ところで、routesでは、"": "index"を使用しても動作しません。 "*action": "index"を使用する必要があります。しかし、私はどこか別のところでは、デフォルトのURLが空の文字列に過ぎないことを学びました。なぜ私はここでそれを使うことができないのですか?

答えて

1

this._indexはajaxコールバック内でのみ設定されるため、このように見えます。これは非同期であるため、インデックスイベントハンドラがトリガする前に実行される保証はありません。

ドキュメントによると、最初のロードで必要なモデルはshould be bootstrappedです。

このコードを構造化する方法の1つは、ルートに当たったときにデータを取得し、リセットイベントをビューにバインドすることです。

var CategoriesView = Backbone.View.extend({ 
    initialize: function() { 
     this.collection.on("reset", this.render); 

    }, 

    ... 

var AppRouter = Backbone.Router.extend({ 

    _index: null, 
    _todos: null, 

    routes: { 
     "": "index", 
     "category/:name": "hashcategory" 
    }, 

    initialize: function(options){ 
     var self = this; 

     self._todos = new TodosCollection(); 
     self._index = new CategoriesView({ collection: self._todos }); 
    }, 

    index: function(){ 
     this._todos.fetch(); 
    }, 

またdata/todolist.jsonを要求するために、適切なURLを構築するために、セットアップにあなたのコレクションを必要とするだろう。

+0

は、私が思う 'self._todos =新TodosCollection(データ);右、'; '' self._todos =新しいTodosCollection()すべきですか? – chaonextdoor

+0

右折&修正。 –

5

実際には、問題はここではinitializeで返され、その中のajax呼び出しが解決されます。あなたは何ができるか

は(一般的に$.ready()

var self = this, 
    p = $.ajax({ 
    url: 'data/todolist.json', 
    dataType: 'json' 
}); 

p.done(function (data) { 
    AppRouter = new Backbone.Router({data: data}); 
    Backbone.history.start({ pushState: true });  
}); 

これはルートをフェッチし、その後は彼らとルータと同様にスタートBackbone.historyを初期化し、あなたのエントリポイントで、次のような何かを行うです。明らかに、初期化でajaxコールを再度行う必要はなく、オプションで渡されたデータを使用するだけです。

+0

Thx男、それは今動作します。もう1つの質問ですが、 '' category /:name '': "hashcategory" 'ルートは決して起動しません。私はhref = '#/ category/num1''属性を持っている私のHTMLに ''リンクを持っています。しかし、それをクリックするたびにurlは変わりますが、何も起こりません。私は 'hashcategory'メソッドで' console.log( 'started') 'を持っていますが、何も表示しません。なぜなのかご存知ですか? – chaonextdoor

0

あなたの問題はあなたのルートの順序です。ルートは順番に評価され、「*アクション」は常に一致します。

試してみてください。あなたのコードで

routes: { 
    "category/:name": "hashcategory" 
    "*action": "index", 
} 
関連する問題