Javascript 如何构造嵌套模型和视图?

Javascript 如何构造嵌套模型和视图?,javascript,backbone.js,Javascript,Backbone.js,使用backbone.js: 我有一个包含多个属性的ModelA集合,还有一个包含多个ModelB的“节点”。ModelB还包含几个属性 CollectionA ModelA Attribute 1 . . Attribute n "Node" ModelB Attribute 1 Attribute 2 ModelB Attribute 1 Attribute 2 ModelA Attr

使用backbone.js:

我有一个包含多个属性的ModelA集合,还有一个包含多个ModelB的“节点”。ModelB还包含几个属性

CollectionA

 ModelA
  Attribute 1
  .
  .
  Attribute n
  "Node"
     ModelB
       Attribute 1
       Attribute 2
     ModelB
       Attribute 1
       Attribute 2

 ModelA
  Attribute 1
  .
  .
  Attribute n
  "Node"
     ModelB
       Attribute 1
       Attribute 2
     ModelB
       Attribute 1
       Attribute 2
我仍在研究视图,但主要思想是视图应该以类似的方式进行结构。(集合视图包含多个视图A,其中包含多个视图B)。同一模型B永远不会在多个视图B之间共享


Q1:设计有意义吗?还是我应该考虑哪些明显的缺陷?(这是我第一次尝试BackboneJs)

问题2:设置“节点”的最佳方式是什么?现在我使用的是一组ModelBs。是否可以在每个ModelA上有一个ModelB集合?哪种方法更好

任何指导方针都是可取的


我还想指出,我读过一篇关于相关问题的优秀文章(推荐)。然而,这种情况并没有像数组中那样包含在数组/集合中的模型B。

Q1:设计有意义吗?或者我应该考虑哪些明显的缺陷? 设计假设:集合A有许多模型As,模型A有模型Bs的集合,每个模型B都有自己的视图B

问题2:每个ModelA上是否可能有一组ModelB

答:可行

模型中有一堆相关的子模型是很常见的。您完全可以通过创建(如您所提到的)一个数组、一个对象、一个集合来保存这些模型B(我们称之为容器)。基本方法就是创建容器,然后实例化新模型并将其插入。很可能您希望在这些模型B中对相关父模型A进行某种引用,以便以后可以返回到该状态。与每个模型一样,B也有一个ModelA_ID作为属性

这可能是保罗·尤索尔的一个很好的利用

使用关系主干,您可以设置您的模型(类),并以这样一种方式定义它,即它有一个模型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填充ModelB集合

当您想要访问ModelA中的ModelB集合时,您只需执行如下操作

myModelA.get('modelBs');
这将返回与该ModelA相关的ModelBs集合,前提是您已获取相关模型,并且集合中包含ModelBs

主干关系的好处在于,在实例化父模型时,可以轻松地自动建立这些定义的关系。它还创建了反向关系,因此从父级到子级、子级到父级的上下遍历非常容易

如果我在操作ModelB并想访问ModelA,我会使用我建立的反向关联键
parentA

someModelB.get('parentA');    // Points to the related ModelA
它还可以帮助处理绑定和其他一些问题,这些问题在模型中的模型中存在时会出现。Relational适用于一对一、一对多和反向关系。这里有一个多对多的解决方案,但我认为这并不常见,因为这是一个很难解决的问题

至于视图,我不确定您到底在想什么,但您是否需要“收集”视图

假设您有一个ModelA和一组ModelBs。每个ModelB都有一个关联的视图。老式列表的概念很好地说明了这一点

<div id="ModelAView">
    <ul>
        <li>ModelB_1</li>
        <li>ModelB_3</li>
        <li>ModelB_7</li>
    </ul>
</div>
现在假设你从你的收藏中去掉ModelB

myModelA.get('modelBs').remove(someModelB);
然后,与此modelB关联的视图将自动从视图中删除


不确定这是否是你的想法。我通常采用这种方法。无论如何,如果有更多的细节,只需在评论中发布它们。希望这能有所帮助。

如果这是您第一次尝试使用主干网,也许您应该更轻松地尝试构建一些简单的东西?也就是说,我几天前发布了这篇文章:我特别指的是那里的
getEventComments
。我也不太清楚您对“node”的确切含义,您能将伪代码重写为一些示例主干代码吗?
myModelA.get('modelBs').remove(someModelB);