1

假设我有一个名为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

现在,如果我要在这两个字符之外包含一个随机数,而是传递一个对象:

res.send({ nonce: randomString, characters: characters.slice(counter, counter+2);

当我这样做时,我无法再访问字符和随机数:

  // 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;

在此处输入图像描述

4

2 回答 2

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);
  }
});
于 2013-06-27T11:57:09.170 回答
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
}
于 2013-06-26T22:05:28.880 回答