将额外数据传递给Backbone Collection fetch - 返回undefined?

时间:2013-06-26 21:51:33

标签: javascript ajax backbone.js express

假设我有一个名为 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 的成功对象中访问我的对象属性?

更新

这是我在第一种情况下将简单数组发送到我的集合时的控制台输出: enter image description here

以及我在@ matt2000建议时发送数据然后在Backbone中将其作为data.models[0].attributes.characters;调用时的样子:

enter image description here

2 个答案:

答案 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
}