【发布时间】:2015-08-02 18:48:39
【问题描述】:
在对我的主干集合执行 fetch() 并将模型实例化为该集合的子节点时,我想向每个模型添加更多信息。
我认为我可以在模型初始化中使用 set 来做到这一点。 (我的假设是 fetch() 正在为传递给它的每个对象实例化一个新模型。因此,随着每次初始化发生,将设置额外的数据。
为了说明我的问题,我粘贴了四个 sn-ps,首先来自我的集合类。其次是我的模型类中的初始化函数。第三,我在初始化函数中使用的两个函数,用于从 flickr api 获取所需信息。第四,也是最后,执行fetch() 的app.js。
首先是集合类:
var ArmorApp = ArmorApp || {};
ArmorApp.ArmorCollection = Backbone.Collection.extend({
model: ArmorApp.singleArmor,
url: "https://spreadsheets.google.com/feeds/list/1SjHIBLTFb1XrlrpHxZ4SLE9lEJf4NyDVnKnbVejlL4w/1/public/values?alt=json",
//comparator: "Century",
parse: function(data){
var armorarray = [];
var entryarray = data.feed.entry;
for (var x in entryarray){
armorarray.push({"id": entryarray[x].gsx$id.$t,
"Filename": entryarray[x].gsx$filename.$t,
"Century": entryarray[x].gsx$century.$t,
"Date": entryarray[x].gsx$date.$t,
"Country": entryarray[x].gsx$country.$t,
"City": entryarray[x].gsx$city.$t,
"Type": entryarray[x].gsx$type.$t,
"Maker": entryarray[x].gsx$maker.$t,
"Recepient": entryarray[x].gsx$recipient.$t,
"Flickrid": entryarray[x].gsx$flickrid.$t,
"FlickrUrl": "", //entryarray[x].gsx$flickrurl.$t,
"FlickrUrlBig": ""//entryarray[x].gsx$flickrurlbig.$t,
});
}
return armorarray;
}
});
第二,我的模型中的初始化。
initialize: function(){
//console.log("A model instance named " + this.get("Filename"));
item = this;
var flickrapi = "https://api.flickr.com/services/rest/?&method=flickr.photos.getSizes&api_key=<my_apikey>&photo_id=" + this.get("Flickrid") + "&format=json&jsoncallback=?";
sources = getFlickrSources(flickrapi);
sources.then(function(data){
sourceArray = parseFlickrResponse(data);
FlickrSmall = sourceArray[0].FlickrSmall;
console.log (FlickrSmall);
item.set("FlickrUrl", FlickrSmall);
console.log(item);
});
请注意我如何获取“Flickrid”并使用它来获取更多信息,然后尝试使用 item.set("FlickrUrl", FlickerSmall); 将其添加回模型中
console.log 确认属性“FlickrUrl”已设置为所需的值。
第三,这些是我的模型用来获取闪烁 api 所需信息的函数。
var getFlickrSources = function(flickrapi){
flickrResponse = $.ajax({
url: flickrapi,
// The name of the callback parameter, as specified by the YQL service
jsonp: "callback",
// Tell jQuery we're expecting JSONP
dataType: "jsonp"})
return flickrResponse;
}
var parseFlickrResponse = function(data){
flickrSourceArray = []
if (data.stat == "ok"){
sizeArray = data.sizes.size;
for (var y in sizeArray){
if (sizeArray[y].label == "Small"){
flickrSourceArray.push({"FlickrSmall": sizeArray[y].source});
}
else if (sizeArray[y].label == "Large"){
flickrSourceArray.push({"FlickrLarge": sizeArray[y].source});
}
}
}
return flickrSourceArray
}
但是,第四,当我尝试执行 fetch 并呈现集合时,我只获取集合中没有 FlickrUrl 属性集的对象。
//create an array of models and then pass them in collection creation method
var armorGroup = new ArmorApp.ArmorCollection();
armorGroup.fetch().then(function(){
console.log(armorGroup.toJSON());
var armorGroupView = new ArmorApp.allArmorView({collection: armorGroup});
$("#allArmor").html(armorGroupView.render().el);
});
var armorRouter = new ArmorApp.Router();
Backbone.history.start();
最后一个 sn-p 中的 console.log 打印出所有假定通过 fetch 实例化的对象/模型。但是它们都没有包含在初始化期间应该是set 的额外属性。
有什么想法吗?
【问题讨论】:
标签: backbone.js