我正在使用backbone.js,我有以下未解决的情况:
假设您有两个模型:
var Person = Backbone.model.extend({
defaults: {
name: '',
age: 24
}
});
var Car = Backbone.model.extend({
defaults: {
type: '',
driving_person: null
}
});
我有一个服务,我可以通过ajax调用调用它,并以下列格式返回汽车json:
{
car: {
type: 'Honda Civic',
driving_person: {
name: 'dan',
age: 13
}
}
}
我在引用该服务的汽车模型中添加了urlRoot属性 现在我想使用fetch来加载特定的汽车,但我想在driving_person属性中使用一个人模型获取汽车模型。怎么能实现这个目标?
答案 0 :(得分:0)
您的汽车型号必须包含user_id或user_name或某些属性, 这样你就可以获取这些数据并在后端进行嵌入。
您还需要使用模型的parse()
方法。
您重写它以解析来自服务器的json响应,
解析时,您会自动在骨干网中创建用户模型
(或者如果已经创建,则参考它。)
但我认为您也可以在创建汽车模型时执行此操作,
在它的initialize()
方法。
这可能会更好。
但是,如果您要问的是如何根据用户选择合适的汽车,当您从服务器请求数据时,则此逻辑位于服务器端。 你需要在服务器端实现它。
如果你想在客户端的模型中嵌入一个driving_person,就像你的json响应一样,只需定义你的driving_person属性,它就会有json对象作为它的值。
如果您想在汽车模型中嵌入新的Backbone.Model,则需要处理汽车模型的initialize()
。
甚至可能是parse()
。
编辑:
如果要在获取后将用户模型嵌入到汽车模型中,则需要覆盖构造函数方法:
var Car = Backbone.Model.extend({
constructor: function(data, options){
this.driving_person = new User(data.driving_person);
delete data.driving_person;
Backbone.Model.prototype.constructor.call(this, data);
}
/// Your other model code like initialize, etc.
编辑2:
如果你想避免每辆车都有一个新的驾驶员模型(因为可能会有更多车辆共享相同的驾驶员),那么你应该有一个全局变量(甚至是一个集合), 需要驱动程序模型。
它必须是代码中前面定义的全局集合。
然后,在我给你的构造函数中将驱动程序添加到该全局集合中。
假设您在代码中先前定义了一个全局DriverCollection (你这样做:
window.DriverCollection = Backbone.Collection.extend({
model: Driver,
然后,你可以制作这样的汽车模型:
var Car = Backbone.Model.extend({
constructor: function(data, options){
if (!window.DriverCollection.find(function(driver){return driver.name == data.driving_person.name;}))
{window.DriverCollection.add(driving_person);}
data.driving_person = data.driving_person.name;
Backbone.Model.prototype.constructor.call(this, data);
}
/// Your other Car model code like initialize etc.
这样,Car构造函数接收JSON数据并将驱动程序添加到全局DriverCollection(如果它不存在),并将汽车的driving_person
属性设置为嵌入式json驱动程序对象的name
属性。 / p>
您当然也可以使用其他财产来参考&寻找你的司机,如id或其他什么。
这样可以避免重复。
您需要为此定义驱动程序模型才能正常工作。