0

そのため、外部ファイルからコレクションにデータを入力し、URLに基​​づいてビューをレンダリングする方法を理解できましたが、問題が発生しています。以下のコードは、ページの読み込みを除いて、意図したとおりに機能しています。次のエラーが発生します。

Uncaught TypeError: Cannot call method 'get' of undefined 

「view.render()」を削除するとエラーは解消されますが、アプリはURLのID変更に応答しなくなります(たとえば、#/ donuts / 1から#/ donuts / 2に変更してもビューは更新されません)

誰かが私をここで正しい方向に向けることができますか?

コード:

(function(){
var Donut = Backbone.Model.extend({
    defaults: {
        name: null,
        sprinkles: null,
        cream_filled: null
    }
});
var Donuts = Backbone.Collection.extend({
    url: 'json.json',
    model: Donut,
    initialize: function() {
        this.fetch();
    }
})

var donuts = new Donuts();

var donutView = Backbone.View.extend({
     initialize: function() {
        this.collection.bind("reset", this.render, this)
    }, 
    render: function() {
        console.log(this.collection.models[this.id].get('name'))
    }
});

var App = Backbone.Router.extend({
    routes: {
        "donut/:id" : 'donutName',
    },

    donutName: function(id) {
        var view = new donutView({
            collection: donuts,
            id: id
        });
        view.render();

    }
});

var app = new App();
Backbone.history.start();
})(jQuery);

JSON:

[
    {
        "name": "Boston Cream",
        "sprinkles" : "false",
        "cream_filled": "true"
    },
    {
        "name": "Plain",
        "sprinkles": "false",
        "cream_filled": "false"
    },
    {
        "name": "Sprinkles",
        "sprinkles": "true",
        "cream_filled": "false"
    }
]
4

1 に答える 1

1

ここではフローの問題のように見えます。コレクションの「リセット」イベントを聞いているビューがあります。したがって、リセットがあると、ビューがレンダリングされます。それは問題ありません。しかし、問題はルーターにあると思います。ルーティングすると、ビューの新しいインスタンスが作成されますが、コレクションには何も行われないため、その状態は同じです。

すでにコレクションを観察しているので、ビューには何もしません。ルーティングするときは、コレクションのURLを更新してから、フェッチを実行します。これによりリセットがトリガーされ、ビューが自動的に更新されます。

于 2012-06-11T21:27:42.123 に答える