1

在许多主干示例中,我看到了带有mymodel.fetch()ormycollection.fetch()的代码,并且大多数代码没有使用成功回调来从响应中构造模型/集合。我正在填写,就像我错过了有关 fetch 如何从结果中创建模型实例的信息。这是怎么发生的?

编辑

  1. 在某些情况下,模型与返回的 json 结构不同,需要映射模型属性。例如,模型属性是 'name' 和 'age' 但返回的 json 是:{n_name:'dan', props: {age: 12, address: '此数据不相关'}}。需要将返回的 json 映射到模型。我该怎么做?这种情况是否迫使我使用成功回调?

  2. 有时模型包含与其他模型或集合的关系。例如,具有 AddressModel 类型的属性和名为 People 的人员集合的 HouseModel。我希望 fetch 在构造 AddressModel 时创建一个模型,并在构造 People 时创建一个人员集合。我该怎么做?我应该为此使用成功还是有其他方法/解决方法?

4

2 回答 2

1

模型的实例已经“构建”好了。这就是你所呼吁fetch()的。

否则,正在发生的事情是响应 JSON 被用于将每个键值对分配为该模型实例的属性。对于集合,它正在根据响应创建新模型。

所以本质上:

// This line instantiates a new model
var model = new MyApp.Models.ModelThing();
// This line loads the model's attributes from the database
model.fetch();

如果您对这一切究竟是如何发生的感兴趣,请查看Backbone.sync方法。这就是 AJAX 请求的实际作用,并触发处理响应的大多数回调。

可以传递给 fetch 的成功和错误回调纯粹是可选的,用于清理失败的加载或向用户发出加载发生的信号。

于 2012-11-12T00:39:35.453 回答
0

这是您可能从中得到的一个示例。我建议您从成功回调函数中操作和使用更新的模型,因为这是异步方法,它可能是您之后可以实际使用模型的唯一方法。

var MyModel = new Todo({id: Number(item)});
MyModel.fetch({success:function(){
        var todo = new updateView({model: dModel });
        todo.render();  
}});

模型已经使用获取的数据构建,但在成功回调中使用该填充模型。

编辑:

对于您的第一个问题:您需要查看model.parse或 collection.parse 的文档,以便您可以为后端响应自定义主干提取。这样做相当容易:

var Collection = Backbone.Collection.extend({

    parse: function(data){return data.objects;} 

});

对于你的另一个问题,我不太明白你想要做什么。但我认为它应该非常简单。你可以用两种方式来做。只是不要尝试在同一个函数(绑定事件和成功回调之外)中单独使用构造和获取的集合,因为由于异步获取,您可能一无所获。

于 2012-11-12T01:00:17.510 回答