Spine.js的真实世界webapp结构

时间:2013-02-02 21:52:51

标签: javascript model-view-controller structure

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

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

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

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

每个页面都具有与标题相同的主结构(或布局),其中包含指向上述页面的链接,搜索输入字段和注销链接(我已经知道登录页面应该是分开的,所以我赢了'请在这里询问身份验证)。

这里棘手的部分是我无法弄清楚如何将整个部分组合在一起我一直在问自己一些问题,在谷歌和StackOverflow上搜索但没有明确的答案。

1 - “必须”脊椎应用程序应用程序只能在一个页面中吗?我的意思是,有页眉和页脚固定但有动态内容DIV根据用户点击标题的哪个标签加载和卸载视图?或者我应该将每个页面视为独立的脊椎应用程序吗?

2 - 我在一个页面中有多个控制器吗?例如,app主控制器和导航控制器(标题)?

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

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

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

我知道这对于更有经验的程序员来说可能是微不足道的问题,但我真的不知道从哪里开始。如果有人能引导我走上正轨,那将是非常棒的。

提前致谢!

DD

1 个答案:

答案 0 :(得分:0)

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

我的答案的实质是你需要熟悉其他框架,以便了解你选择的那个试图解决的问题。你的问题是可以理解的。其他人一直在努力解决缺乏一种“正确”做某些常见事情的方法。根据示例,包装/扩展和替代框架创建解决方案。也许,你应该寻找与Backbone相关的信息,这些信息激发了Spine并且仍然与它相似。

正如你所说,你熟悉Rails的MVC。然后是Spine的MVC方法,它完全不同。这应该给你一个提示,MVC(或一般的MV *)是具有非常不同的实现的广义。好吧,你可能认为Rails毕竟是一个基于请求的服务器端框架,并且Spine是一个基于客户端事件的框架 - 因此差异是可以理解的。好吧,客户端JavaScript框架之间也没有统一性。例如,上面提到的Backbone有所谓的Views,它实际上扮演着控制器的角色。所以我猜Spine创建者所做的一件事就是将视图重命名为控制器以保持清晰。 Addy Osmani详细解释了JavaScript的MV *。还有a good overview JavaScript框架。

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

  1. 使用Spine,不需要应用程序是单页面应用程序(SPA)。
  2. 您可以创建一个包含多个页面的应用程序,每个页面都加载自己的Controller。在这种情况下,您的视图可以在服务器上呈现,您的模型可以从生成的JavaScript中引导。如果您不想要SPA,但仍希望组织JavaScript或拥有一些可重用的组件,那么这很好。

    然而,从Spine的功能集(例如路线)来看,它是在考虑到SPA的情况下创建的。

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

    2. 这不是真的(没有技术限制),虽然single responsibility principle使事情变得更容易。

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

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

    5. 再次:

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