假设我有一个名为 index 的Backbone路由从服务器获取一个集合:
var characters = new App.Collections.Characters();
characters.fetch({
success: function(data) {
var homeView = new App.Views.Home({
collection: new Backbone.Collection(data)
});
$('#content').html(homeView.render().el);
}
});
非常简单吧?在获取成功时,创建一个新视图并使用从服务器检索的数据填充它。
这假设我只传递一个字符数组。在Express 3.0中:
res.send(characters.slice(counter, counter+2)); // array of 2 characters
现在,如果我要在两个字符之外加入nonce,而是传递一个对象:
res.send({ nonce: randomString, characters: characters.slice(counter, counter+2);
当我这样做时,我再也无法访问字符或nonce:
// the same fetch function from above
success: function(data) {
console.log(data.nonce); // undefined
console.log(data.characters); // undefined
}
Backbone Collection是否在引擎盖下做了一些阴暗的事情?为什么我无法从服务器传递的 collection fetch 的成功对象中访问我的对象属性?
这是我在第一种情况下将简单数组发送到我的集合时的控制台输出:
以及我在@ matt2000建议时发送数据然后在Backbone中将其作为data.models[0].attributes.characters;
调用时的样子:
答案 0 :(得分:1)
Backbone在引擎盖下做了一点魔力。服务器提供的原始数据不是作为success
回调的第一个参数传递,而是传递给已解析的集合(Backbone doc)。
您可以覆盖集合的默认parse
方法,以便从服务器的响应中获取数组。
var Characters = Backbone.Collection.extend({
url : //REST access point
parse : function( response ) {
this.nonce = response.nonce;
// Anything returned by this function will be used as the first argument to
// construct the collection.
return response.characters;
}
});
现在,您可以在获取时直接使用字符实例,而不必使用结果创建新集合。
var characters = new Characters();
characters.fetch({
success: function( collection ) {
var homeView = new App.Views.Home({
collection: collection
});
$('#content').html(homeView.render().el);
}
});
答案 1 :(得分:0)
传递给成功回调的数据应该是一个对象数组。我想你的意思是:
res.send([{ nonce: randomString, characters: characters.slice(counter, counter+2]);
和
success: function(data) {
console.log(data[0].nonce); // randomString
console.log(data[0].characters); // count
}