我已经使用下划线模板配置了一个简单的骨干模型和视图。完全相同的配置用于两个独立的API。渲染没有被调用一个API并且是另一个
API 1按预期工作。
要重现该问题,注释掉的URL API 1,取消对URL的API 2.
正如你可以看到我已经规范了两种API响应数据,完全相同的数据结构为两个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我已经将Backbone的最佳实践添加到了我的答案中。 –
感谢您的更新答案! – arctelix