Backbone.js 主干木偶模块作为类似于Twitter Flight的小部件
我正在阅读如何选择正确的客户端框架来在小部件中分割/模块化我的前端代码 基本上,我拥有/想要的是:Backbone.js 主干木偶模块作为类似于Twitter Flight的小部件,backbone.js,marionette,Backbone.js,Marionette,我正在阅读如何选择正确的客户端框架来在小部件中分割/模块化我的前端代码 基本上,我拥有/想要的是: 一个具有多种页面类型的复杂网站,因此没有单页应用程序 所有页面都能够在不使用javascript的情况下呈现完整的页面。IOW:javascript仅用作扩展 很多页面都有一种非常动态的方式,可以在屏幕上显示小部件。为了克服服务器端的复杂性,我将代码模块化为小部件(复合模式),每个小部件负责自己的工作: 服务器端控制器代码 服务器端模板(使用hogan/mustache) 路由端点,是否需要从
- 一个具有多种页面类型的复杂网站,因此没有单页应用程序李>
- 所有页面都能够在不使用javascript的情况下呈现完整的页面。IOW:javascript仅用作扩展李>
- 很多页面都有一种非常动态的方式,可以在屏幕上显示小部件。为了克服服务器端的复杂性,我将代码模块化为小部件(复合模式),每个小部件负责自己的工作:
- 服务器端控制器代码
- 服务器端模板(使用hogan/mustache)
- 路由端点,是否需要从客户端调用
- 结构化css(与外观相反,改变小部件结构的css)
- 服务器端区域管理器最终决定呈现哪些小部件以及它们在屏幕上呈现的位置。最终结果是RegionManager将整个html(服务器生成的)作为其所有窗口小部件呈现的组合输出李>
我想基本上我要问的是,是否有人有做这些事情的经验。我认为只使用Backbone.js非常适合您所描述的这种类型的应用程序。您可能已经阅读过这篇文章,但大多数Backbone文献都集中在您的视图中,其中包含相关的服务器生成JSON模式ls和集合,然后使用视图的呈现函数(在客户端上)生成表示模型/集合的HTML UI 然而,它不必以这种方式使用。事实上,没有什么能阻止您将视图附加到已经包含内容的现有元素,这为您提供了主干模块化、事件系统等的所有好处。我经常使用没有模型或集合的视图,纯粹是因为我喜欢视图的一致性我还使用了下面描述的方法,在我不得不使用旧的、现有的应用程序的情况下,这些应用程序还没有或者永远不会有一个好的RESTAPI,但它们确实以HTML提供内容 首先,假设以下HTML代表您的一个小部件:
<div id="widget">
<div class="widget-title"></div>
<div class="widget-body">
<!-- assume lots more html is in here -->
<a href="/Controller/DoWidgetStuff">Do something!</a>
</div>
</div>
请注意,小部件接收URL作为其构造函数/初始化函数的参数。此小部件模型将代表许多小部件(当然,您可以对更复杂的模型采用这种通用方法,并从呈现的HTML中提取不同的数据)。接下来是您的视图。您可能知道,通常在实例化大多数视图时会向它们传递一个模型或集合。但是,在这种情况下,您可以在视图的初始化函数中创建小部件模型,并通过预呈现的HTML向其传递URL,如下所示:
App.WidgetView = App.View.ComboboxView = Backbone.View.extend({
initialize: function () {
this.model = new App.WidgetModel({}, { url: this.$("a").attr("href") });
}
// rest of the view code
});
因此,实例化视图类似于:
new App.WidgetView({el: $("#widget")})'
通过完成以上所有工作,您可以完成主干网为您提供的几乎所有其他功能及其模块化和良好封装,这正是您所追求的
整个方法的最终结果是:
小部件模型上的标准主干获取和保存函数来获取新内容。在本例中,它来自从呈现的当您得到响应时,您可以使用视图、呈现函数或其他细粒度函数根据需要更新页面上的HTML
几点:
唯一需要注意的是,如果服务器提供的是“text/html”,则需要将fetch
和save
函数的内容类型更改为“text/html”。例如:
this.model.fetch({
type: "POST",
contentType: "text/html"
});
最后,我提出的模型是实例化的,没有任何内容,您可能需要使用您的模型,以便它可以将此内容正确地存储在其属性集合中。有关更多信息,请参阅。Twitter表示,他们已经在其Web应用程序中使用Flight,因此尽管其开源是新的,但它本身并不是新的。如果您认为它适合您,您可能应该尝试一下。我认为它不适合他是爪哇人
this.model.fetch({
type: "POST",
contentType: "text/html"
});