私はアンダースコアテンプレートを使用して単純なバックボーンモデルとビューを設定しました。 2つの別々のAPIで全く同じ設定が使用されます。レンダリングが1つのAPIに対して呼び出されず、別のものになります
API 1は期待どおりに動作します。
は、問題を再現API 1のURLをコメントアウトし、API 2.
あなたは、私は両方のAPIの応答データを正規化している見ることができるようにするために、URLのコメントを解除するには、まったく同じデータ構造があります両方のapisのために返されました。ただし、API 2のレンダリングメソッドは呼び出されません。問題をさらに奇妙なものにするために、まれにAPI 2によってレンダリングが呼び出されます。
ここでは何が欠けていますか?
// Model
var Quote = Backbone.Model.extend({
// API 1
//urlRoot: 'http://quotes.stormconsultancy.co.uk/quotes/1.json',
// API 2
urlRoot: 'http://quotes.rest/qod.json',
parse: function (data){
try{
data = data['contents'].quotes[0];
}
catch(e){
}
var rd = {author:data.author, quote:data.quote}
console.log("parsed", typeof rd, rd);
return rd;
},
// UPDATE as suggested by cory
initialize: function() {
this.on('all', function(eventName) {
console.log('QuoteModel: ' + eventName);
});
}
});
// View
var QuoteView = Backbone.View.extend({
initialize: function() {
this.template = _.template($('#quote-template').html());
this.listenTo(this.model, 'change', this.render);
},
render: function(){
console.log("render", this.model.attributes)
this.$el.html(this.template(this.model.attributes));
}
});
var quoteM = new Quote();
quoteM.fetch();
$(document).ready(function() {
\t var quoteV = new QuoteView({
\t \t el: $('#quote'),
\t \t model: quoteM
\t });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/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>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.min.js"></script>
<script type="text/html" id="quote-template">
\t \t <p>The author is : <%= author %></p>
\t \t <p>The content is : <%= quote %></p>
</script>
<div id="quote"></div>
ありがとうございます!私はそれを逃したとは信じられません。 – arctelix
@arctelixバックボーンのベストプラクティスを自分のコードに追加しました。 –
更新された回答もありがとう! – arctelix