2

JavaScriptファイルをより適切に構造化するためにBackbone.jsの使用を開始したいと思います。ただし、APIを介してJSONだけを出力するようにアプリケーションをやり直したくありません。間違っている場合は修正してください。ただし、これまでのところ、JSONAPIがなくてもBackbone.jsを使用できるという印象があります。サーバーがHTMLを返し、Backboneモデルがそれを気に入らず、エラーを返すという問題が発生しています。

基本的に、カテゴリに応じてHTMLスニペットをロードします。

var Filter = Backbone.Model.extend({
    url: '/filters/',
});
var FilterView = Backbone.View.extend({
    initialize: function() {    
        this.model.on('change', this.updateFilter, this);
        this.changeFilter();
    },

    changeFilter: function() {
        this.model.fetch({data: $.param({category: this.options.category})});
    },

    updateFilter: function(filters) {
        console.log(filters);
        this.$el.html(filters);
    },
});

var filter = new Filter();
var filterView = new FilterView({
    el: $( '#filterContainer' ),
    category: $( '#categorySlug' ).data( 'slug' ),
    model: filter,
});

この単純なモデルを使用して、Ajaxを介してHTMLスニペットを取得できると思いました。リクエストは正しく実行されますが、Backboneはエラーを返し、updateFilter呼び出されることはありません。

私は何かを得ていませんか?JSON応答ではなくHTMLで機能させるには、何を変更する必要がありますか?それとも、モデルを使用するべきではありませんか?

4

5 に答える 5

2

snippetこれは実際には Backbone が動作するように設計された方法ではありませんが、モデルに適切なparse関数を含めることで、コンテンツをモデル フィールド ( と呼びます) にシムすることができる場合があります。

var Filter = Backbone.Model.extend({
  url: '/filters/',
  parse: function (response) {
    return {
      snippet: $(response)
    }
  }
});

ここでも、Backbone の自然な順序から少し外れていますが、通常のfetch()get()、およびset()メソッドを使用してモデルのコンテンツを管理できるはずです。例えば、

// in view:
updateFilter: function (filter) {
    this.$el.html(filter.get('snippet'));
},
// etc..
于 2012-09-08T16:12:07.813 に答える
2

私の意見では、問題は、リクエストの受け入れヘッダーにapplication/jsonデフォルトとして含まれているため、エラーが発生することです。を実行して、accept ヘッダーを微調整できますmodel.fetch({ dataType : 'html'})。この質問に対する受け入れられた答え: Backbone.js fetch with parametersは、これを見つけるのに役立ちました。

于 2013-06-25T20:45:51.013 に答える
0

この質問は少し古いですが、アイテムサーバー側をループしてページがレンダリングされたときにコレクションに追加することで、モデルを更新する本当に良い方法を説明している git のプロジェクトを見つけました。

https://github.com/runemadsen/Backbone-With-Server-Side-Rendering/blob/master/views/modeltest.erb

于 2013-10-02T15:39:40.727 に答える