Q1:设计是否有意义或者我应该考虑任何明显的缺陷?设计假设:集合 A 有许多模型 A,模型 A 有模型 B 集合,每个模型 B 都有自己的视图 B。
Q2:每个ModelA上可能有一个ModelB的集合吗?
答:可行。
模型在其中“包含”一堆相关的子模型是很常见的。你绝对可以通过创建(就像你提到的那样)一个数组、一个对象、一个包含这些模型 B 的集合(我们称之为容器)来实现它。基本的方法就是创建容器,然后实例化新模型和将它们插入。很可能您希望在这些模型 B 中对相关的父模型 A 进行某种引用,以便您稍后可以返回到该状态。就像每个模型 B 都有一个 ModelA_ID 作为属性。
这可能是对 Paul Uithol 的Backbone-Relational的一个很好的使用。
使用 Backbone-Relational,您可以设置模型(类)并以具有模型 B 集合的方式定义它。这是代码的样子。
ModelA = Backbone.RelationalModel.extend({
relations: [{
type: Backbone.HasMany,
key: 'modelBs',
relatedModel: 'ModelB',
collectionType: 'ModelBCollection',
reverseRelation: {
key: 'parentA'
}
}],
defaults: ...,
initialize: ...,
etc. ... // Other instance properties and functions of model.
});
执行此操作时,您实例化的每个模型 A 都将拥有一组模型 B,可以通过 ModelA 属性引用这些模型modelBs
B。或您指定的任何键。
下面是实例化 ModelA 的样子。
myModelA = new ModelA({
// Setting up ModelA attributes...
'modelBs': [1, 3, 7]
});
我已经实例化了 ModelA,并且在设置您可能已经定义的其他属性的同时,我还设置了 ModelA 的属性 modelBs 的值。这是与 ModelA 相关的每个 ModelB 的 id 数组。这就是您的集合如何知道哪些 ModelB 与此 ModelA 相关联。
myModelA.fetchRelated('modelBs');
您的.fetchRelated()
调用向服务器发送请求,以使用 ModelB 1、3 和 7 填充 modelBs 集合。
当您想访问 ModelA 中的 ModelB 集合时,您只需执行以下操作。
myModelA.get('modelBs');
这将返回与该 ModelA 相关的 ModelB 集合,假设您已获取相关模型并且该集合中包含 ModelB。
Backbone-Relational 的好处是它可以很容易地在父模型的实例化时自动建立这些定义的关系。它还创建了反向关系,因此从父级到子级、子级到父级的上下遍历很容易。
如果我正在操作 ModelB 并想到达 ModelA,我使用我建立的 reverseRelation 键parentA
。
someModelB.get('parentA'); // Points to the related ModelA
当您在模型中有模型时,它还有助于解决绑定和其他一些问题。关系适用于一对一、一对多和反向关系。有一个多对多的解决方法,但我认为这并不常见,因为对于事物的设置方式来说,这是一个困难的命题。
至于观点,我不确定你到底在想什么,但你需要有一个“集合”的观点吗?
假设您有 ModelA 和 ModelB 的集合。每个 ModelB 都有一个关联的视图。老式 LIST 的概念很好地说明了这一点。
<div id="ModelAView">
<ul>
<li>ModelB_1</li>
<li>ModelB_3</li>
<li>ModelB_7</li>
</ul>
</div>
虽然有一堆 ModelB,但您已经将它们整齐地放在一个集合中。如果您使用数据驱动的方式来管理您的视图,则无需将视图对象放在另一个列表中。相反,您可以让它们自我管理!
// Assume when you instantiate ViewB, you pass to it a ModelB.
ViewB = Backbone.View.extend({
initialize: function() {
this.model.bind('remove', this.remove, this);
this.model.bind('update:colorAttr', this.updateColor, this);
},
updateColor: function() {
this.$el.css('color', this.model.colorAttr);
}
});
现在假设您从您的收藏中删除了 ModelB。
myModelA.get('modelBs').remove(someModelB);
然后与此模型B 关联的视图将自动从视图中删除。
不确定这是否是您的想法。我通常采用这种方法。无论如何,如果有更多细节,请在评论中发布。希望这可以帮助。