我最近遇到了一些情况,在该页面上,我在页面上有多个需要由单个模型来支持的视图。这样,仅通过修改模型,所有相关视图都会自动更新其外观。问题是,为了实现此ATM,我需要编写积极寻找这些模型的代码。我偶尔会很幸运,并通过活动处理程序为我提供一个模型,但通常情况并非如此。我正在寻找一种很好的方法,可以一次在页面上使用单个模型,然后引用其他任何地方的模型。人们通常如何应付这种需求?骨干关系通过使用Lawnchair.js保留中央商店来处理它,我听说人们使用单个全球收藏来保留所有模型的注册表。
简短答案:
通过多个视图共享的一个模型(您可以称为"重复模型")实际上是一个完全有效(有用的)骨干模式。这根本不是问题。从我可以看出的问题是,很难将该模型纳入多种视图,因此我建议解决这个问题。
更长的答案:
将模型传递给多个视图的问题是,它固有地将视图融在一起(为了向每个视图提供共享模型,父级视图也需要具有该模型,以及"介于两者之间"的视图)。现在,作为程序员,我们已经被教导要尽可能地封装事物,因此耦合视图一开始似乎是"错误的"。但是,几个视图实际上是可取的:关键是要正确限制视图耦合。
@shauna为此提出了一个很好的经验法则:"一种观点只在乎自己并创造孩子。"如果您遵守此规则,则视图之间的耦合不会成为问题,并且您将能够创建灵活,可维护的代码(比使用全局变量更可维护的代码,因为您真的丢失了封装)。
鉴于所有这些,让我们检查一个快速的例子。假设您有所有使用Model X的视图A,B和C。
1)首先,我要研究为什么在如此不同的斑点中建造A,B和C,看看我是否不能将它们移到更近的位置。
2)如果必须相距甚远地建造它们,我然后看看它们是否有共同点我可以利用;例如,所有这些斑点都共享某些相关对象吗?如果是这样,也许我们可以将X放在该对象上以与我们所有的观点共享。
2)如果代码放置中没有连接或在A,B和C之间的常见变量中,那么我必须问"我真的应该在它们之间分享模型吗?"
关于作者的无聊故事:
当我第一次开始使用骨干时,我经常会发现自己与同事争论,因为我想进行全球变量,他们坚定地反对它们。我试图向他们解释说,如果我不使用全球群体,我必须从视图a中传递模型以查看b以查看c以查看d以查看e,何时只有e实际上需要该模型。这样的浪费!
除了(从那以后我学到的那样),我错了。至少从可维护性的角度来看,全球群体是一个可怕的想法。一旦开始使用它们,您很快就不知道什么代码会影响什么,因为您会在使用该全局变量的视图之间丢失通常具有的封装。而且,如果您正在从事一个有意义的大型项目(即值得使用骨架的一个)封装是保持代码理智的唯一方法之一。
在两者之间经常使用骨干后,我现在坚信正确的答案是在创建时将模型传递给您的视图。这可能意味着在不直接使用它们的中介视图之间传递模型,但是与通过Globals通过模型通过模型相比,这样做将为您提供更好,更可维护的代码。最初可能会感到尴尬,当您创建它们时,将模型传递给视图是正确的实践。
一旦您更熟悉骨干,您可能会发现您很少需要通过多个中介视图将模型通过。实际上,您可能会注意到,每当您发现自己必须通过一个以上的视图之间的模型来检测到"代码气味",而真正的问题是您的代码需要重构。
但是,与堆栈溢出上的所有其他所有内容一样,您的里程可能会有所不同; - )