3

私のコードは次のとおりです。

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();
    },
 ....

しかし、私が始めると、firebug コンソール パネルは常に関数this._index内で null であると通知しindexます。self._index.render()コールバック関数の下部で使用し$.ajax successて、ホームページをレンダリングする必要があります (上記でコメントアウトされています)。index関数は関数の前に実行されるようですinitialize。どうすればそれが起こり、どうすれば修正できますか?

ちなみに では、routesを使う"": "index"と動かなくなります。私は使用する必要があります"*action": "index"。しかし、デフォルトの URL は単なる空の文字列である可能性があることを別の場所で学びました。なんでここじゃ使えないの?

4

3 に答える 3

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 });    
});

これにより、ルートが取得されそれらでルーターが初期化され、 start が実行されますBackbone.history。明らかに、初期化で ajax 呼び出しを再度実行する必要はありません。オプションで渡されたデータを使用するだけです。

于 2012-04-27T18:18:46.653 に答える
1

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

ドキュメントによると、初期ロードで必要なモデルはブートストラップする必要があります。

それが不可能な場合、このコードを構造化する 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();
    },

リクエストする適切な URL を構築するために、コレクションをセットアップする必要もありますdata/todolist.json

于 2012-04-27T11:34:59.540 に答える
0

あなたの問題はあなたのルートの順序です。ルートは順番に評価されるため、「*action」は常に一致します。

試す:

routes: {
  "category/:name": "hashcategory"
  "*action": "index",
}
于 2012-11-29T23:45:35.360 に答える