【发布时间】:2014-06-06 21:50:45
【问题描述】:
我一直在努力寻找解决这个问题的方法,但我认为我的模式是错误的。
我不知道如何使用collection.fetch() 来获取初始渲染的数据。
我正在调用 Flickr API 来构建一些图像。单击按钮时,应将下一页值传递给collection.url,并提交一个新的 ajax 请求以重新呈现模板。但是,我无法让集合从 Flickr 中提取数据并将其传递给初始渲染时的模板。
这是我当前代码的一个小提琴:http://jsfiddle.net/48WpV/
这是我的 JavaScript:
var urlParameters = {
page: 1,
api_key:'a2978e5ce30c337e3b639172d3e1a0d1',
tags: 'cats',
method: 'flickr.photos.search',
per_page: 3,
format: 'json'
};
var TheModel = Backbone.Model.extend({
default: {
photos: '',
stat: ''
}
});
var TheCollection = Backbone.Collection.extend({
model: TheModel,
url: 'http://api.flickr.com/services/rest'
});
var TheView = Backbone.View.extend({
el: '.js-container',
initialize: function () {
this.collection = new TheCollection();
this.fetchData();
this.listenTo(this.collection, 'change', this.render);
return this;
},
render: function () {
var temp = _.template( $('#List').html(), {collection: this.collection.toJSON()} );
this.$el.html(temp);
return this;
},
fetchData: function () {
var self = this;
this.collection.fetch({
type: 'GET',
dataType:'jsonp',
data: urlParameters,
jsonp:'jsoncallback',
success: function (data) {
console.log('self.collection =',self.collection.toJSON());
},
error: function () {
console.log('ERROR!!!');
}
});
return this;
},
events: {
'click .js-button': 'nextPage'
},
nextPage: function () {
urlParameters.page = urlParameters.page + 1;
this.fetchData();
return this;
}
});
var theView = new TheView();
theView.render();
这是我的 HTML:
<script type="text/template" id="List">
<button class="js-button">Click for the next page</button>
<% console.log('templates collection=',collection) %>
<% _.each(collection, function (element, index) { %>
<% _.each(element.photos.photo, function(ele, i) { %>
<img src="http://farm<%- ele.farm %>.staticflickr.com/<%- ele.server %>/<%- ele.id %>_<%- ele.secret %>_m.jpg" />
<% }); %>
<% }); %>
</script>
<div class="js-container">
</div>
【问题讨论】:
-
(1)
fetch是一个 AJAX 调用,您必须等到它完成后才能对其结果执行任何操作。 (2)self.collection = data没有任何作用,data应该已经是集合,fetch就地更新集合。 -
@muistooshort 谢谢你的解释。我不清楚集合是否会在获取后更新,或者我是否必须重新分配响应的值。
-
我重新打开是因为您有两个问题:AJAX 问题和
url问题。 -
仅供参考,如果您想将其他数据保留在内存中(或者因为您想一次显示所有数据,或者因为您希望用户能够返回并避免重新获取较早的数据),将
remove: false放入您的fetch参数中。然后它只会添加新模型并合并现有模型。 -
您可以
this.listenTo(this.collection, 'reset', this.render)然后用reset: true调用fetch。类似于这个版本的拉米小提琴:jsfiddle.net/ambiguous/gu8v5。或者你可以移动一些东西并这样做:jsfiddle.net/ambiguous/8993M
标签: javascript jquery backbone.js underscore.js