1

我使用 Spine.js 和 CoffeeScript 研究 JavaScript MVC 已经有一段时间了。我开发 Ruby on Rails 有一段时间了,所以我了解模型、视图和控制器应该分别处理什么(基于我对它的适度经验)。但是在 Rails 中,我们已经知道(一般来说)每个控制器基本上都是控制一堆视图(或页面)并一次处理一个或多个模型的东西。(也许,如果我错了,请纠正我,因为我不是专业人士,但我必须承认)。

然而,我在架构方面发现了一个与 Spine 完全不同的概念。我阅读了它的文档并深入研究了它的示例应用程序。不幸的是,所有 Spine 示例应用程序都展示了如何处理单页应用程序,而在现实世界中“更大”的应用程序将不再是这种情况。(如果 Spine 只能用于“单页应用程序”,请纠正我)。

假设有一个网站(或应用程序)由许多页面/部分/模块组成,如下所示:

1 - 主页,例如显示基于缩略图的列表 2 - 联系人页面 3 - 当前用户的个人资料管理页面(普通 CRUD)

每个页面都具有与标题相同的主要结构(或布局),带有指向上述页面的链接、搜索输入字段和注销链接(我已经知道登录页面应该是分开的,所以我不会问认证在这里)。

这里棘手的部分是我无法真正弄清楚如何将整个部分联系在一起,我一直在问自己一些问题,在 Google 和 StackOverflow 上进行了搜索,但没有明确的答案。

1 - “必须”一个脊椎应用程序应用程序只在一页中?我的意思是,固定页眉和页脚,但有一个动态内容 DIV,它根据用户在页眉上单击的选项卡加载和卸载视图?还是应该将每个页面视为独立的脊椎应用程序?

2 - 我在一页中有多个控制器吗?比如app主控制器和导航控制器(header)?

3 - 每个控制器是否应该处理一个模型或与之关联的模型?(在示例中,它们之间始终存在一对一的关系,例如任务模型和任务控制器)。

4 - 我应该在我的应用程序中的哪里存储与接口相关的状态变量。我是否应该创建一个“记住”当前用户的模型,或者例如突出显示哪个选项卡以供进一步参考?或者我应该将它们存储到控制器中吗?

5 - 如果它是一个单页应用程序(但有很多部分或模块),我应该为这个页面内的每个加载部分都有一个控制器吗?

我知道这些对于更有经验的程序员来说可能是微不足道的问题,但我真的不知道从哪里开始。因此,如果有人能引导我走上正确的道路,那就太棒了。

提前致谢!

DD

4

1 回答 1

0

我认为这是一个非常好的问题。我的答案会很广泛,所以请耐心等待。

我的回答的本质是,您需要熟悉其他框架才能了解您选择的框架要解决的问题。你的问题是可以理解的。其他人一直在为缺乏一种“正确”的方式来做一些常见的事情而苦苦挣扎。解决方案是根据示例、包装器/扩展和替代框架创建的。也许,您应该寻找与Backbone相关的信息,它启发了 Spine 并且仍然与它相似。

正如您所说,您熟悉 Rails 的 MVC。然后是 Spine 的 MVC 方法,它完全不同。这应该给您一个提示,即 MVC(或一般的 MV*)是具有非常不同实现的广泛概念。好吧,您可能会认为 Rails 毕竟是一个基于请求的服务器端框架,而 Spine 是一个基于客户端事件的框架——所以区别是可以理解的。好吧,客户端 JavaScript 框架之间也没有统一性。比如上面提到的 Backbone 有所谓的 Views,其实就是起到了控制器的作用。所以我想 Spine 的创建者所做的一件事就是为了清晰起见将 Views 重命名为 Controllers。Addy Osmani详细解释了 JavaScript 的 MV* 。还有一个很好的概述JavaScript 框架。

所以 Spine 和 Backbone 的一个“问题”是它们没有规定任何架构。换句话说,他们不够有主见。您可以根据需要使用它们,这一事实令人沮丧。下面我试着回答你的问题:

  1. 使用 Spine,应用程序不需要是单页应用程序 (SPA)。

你可以创建一个有多个页面的应用程序,每个页面加载它自己的控制器。在这种情况下,您的视图可以在服务器上呈现,并且您的模型可以从生成的 JavaScript 引导。当您不想要 SPA,但仍想组织 JavaScript 或拥有一些可重用的组件时,这很好。

但是,从 Spine 的特性集(例如路由)来看,它是在考虑 SPA 的情况下创建的。

  1. 对于 SPA 和复杂的 UI,通常最好将部分 UI(小部件)分开。在 Spine 中,控制器是这种分离的手段。所以是的,使用多个控制器并使用控制器嵌套。也许,应该有一个最顶层的应用程序控制器。

  2. 这不是真的(没有技术限制),尽管单一责任原则使事情变得更容易。

  3. 将这些变量存储在相应级别的控制器中。如果您需要观察这些值,请将它们存储为模型,否则将它们存储为控制器属性。

  4. 您可以拥有一个 App 控制器,其中包含页眉、页脚、侧边栏控制器和活动页面。在 Routes 中,您创建一个相应的控制器并将其传递给 App 控制器,该控制器将主区域内容替换为该控制器的元素。这是一种可能的方法。

再来一次:

人们一直在为 Backbone/Spine 中的应用程序架构缺乏具体性而苦苦挣扎。他们创建了一些解决方案,如应用程序控制器、布局管理器等。对于 Backbone,您可以查看MarionetteChaplinThorax。通过向他们学习,您将能够为您的 Spine 应用程序提出一个架构。祝你好运!

于 2013-02-02T23:31:42.823 回答