在许多骨干示例中,我看到了带有mymodel.fetch()
或mycollection.fetch()
的代码,并且大多数代码都没有使用成功回调来构建响应中的模型/集合。我正在填写,因为我遗漏了一些关于fetch如何从结果中创建模型实例的东西。这是怎么发生的?
编辑
Thare是模型与返回的json结构不同的情况,需要映射模型属性。例如,模型属性是'name'和'age',但返回的json是:{n_name:'dan',props:{age:12,address:'此数据不相关'}}。需要将返回的json映射到模型。我该怎么做?这种情况是否迫使我使用成功回调?
有时,模型包含与其他模型或集合的关系。例如,具有AddressModel类型属性的HouseModel和名为People的人员集合。我希望fetch在构造AddressModel时创建一个模型,并在构造People时创建一个people集合。我该怎么做?我应该使用此成功还是其他方式/解决方法?
答案 0 :(得分: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的成功和错误回调纯粹是可选的,用于执行清理失败的加载或向用户发出加载发生的信号。
答案 1 :(得分: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;}
});
对于你的另一个问题,我并没有得到你想要做的事情。 但我认为这应该是非常简单的。你可以两种方式做到这一点。 只是不要尝试使用构造和&在同一个函数中(在绑定事件和成功回调之外)自己获取集合,因为由于异步获取,你可能什么也得不到。