通过扩展增强主干以改善体验

wufei123 2024-06-02 阅读:58 评论:0
Backbone 作为一种 Web 应用程序开发框架变得越来越流行。随着这种流行,无数的扩展和插件来增强框架的功能,并填补其他人认为需要填补的漏洞。让我们来看看一些最佳选择。 骨干.木偶 由 Derick Bailey 开发,这个...

通过扩展增强主干以改善体验

Backbone 作为一种 Web 应用程序开发框架变得越来越流行。随着这种流行,无数的扩展和插件来增强框架的功能,并填补其他人认为需要填补的漏洞。让我们来看看一些最佳选择。

骨干.木偶

由 Derick Bailey 开发,这个扩展相当大,是我个人最喜欢的。 Derick 决定填补他认为存在的所有最大漏洞,而不是向 Backbone 添加一两个功能。以下是他在 GitHub 项目的自述文件中对此的说法。

“Backbone.Marionette 是 Backbone.js 的复合应用程序库,旨在简化大型 JavaScript 应用程序的构建。它是我 (Derick Bailey) 使用 Backbone 构建的应用程序中发现的常见设计和实现模式的集合,并包括受复合应用程序架构启发的各种部分,例如 Microsoft 的“Prism”框架。”

让我们仔细看看 Marionette 为我们提供了什么:

  • 应用程序:这是一个中心对象,应用程序中的所有内容都可以通过它进行通信。它提供了一种快速、轻松地设置应用程序主视图的方法,一个中央事件中心,应用程序中的每个模块都可以通过它进行通信,这样它们就不会相互依赖,并且提供了用于细粒度控制的初始化程序您的应用程序如何启动。
  • 模块:一种封装模块代码并在中央应用程序对象上命名这些模块的方法。
  • 视图:要扩展的新视图类提供了用于清理的本机方法,因此您不会最终出现内存泄漏。它还包含渲染样板;对于简单视图,只需指定模板和模型,它就会处理其余的事情。
  • 集合/复合视图:这就是“复合应用程序库”发挥作用的地方。这两个视图使您可以轻松创建视图,这些视图可以处理渲染集合中所有视图的过程,甚至是集合和模型的嵌套层次结构,只需很少的努力。
  • 区域和布局:区域是一个对象,可以处理 DOM 中特定位置的渲染、取消渲染和关闭视图的所有工作。布局只是一个普通视图,其中还内置了用于处理子视图的区域。
  • AppRouter:一种新型路由器,可以使用控制器来处理工作负载,以便路由器只包含路由的配置。
  • 事件:Marionette 从 Wreqr 项目扩展而来,使 Backbone 的事件更加强大,可用于创建基于事件的大型应用程序。

我只触及了 Marionette 功能的皮毛。我绝对建议前往 GitHub 并阅读他们在 Wiki 上的文档。

此外,Andrew Burgess 在他的 Tuts+ Premium 高级骨干模式和技术课程中介绍了 Marionette。

骨干网验证

Backbone.Validation 旨在填补一小部分问题:即模型验证。 Backbone 有多个验证扩展,但这个扩展似乎赢得了社区的最多尊重。

实际上,您不必为模型编写 validate 方法,而是可以为模型创建 validation 属性,该属性是一个对象,指定您希望验证的每个属性以及验证列表每个属性的规则。您还可以为每个属性指定错误消息,并传入自定义函数来验证单个属性。您可以看到下面的示例,该示例是根据其网站上的示例之一修改的。

var SomeModel = Backbone.Model.extend({ validation: { name: { required: true }, 'address.street': { required: true }, 'address.zip': { length: 4 }, age: { range: [1, 80] }, email: { pattern: 'email', // supply your own error message msg: "Please enter a valid email address" }, // custom validation function for `someAttribute` someAttribute: function(value) { if(value !== 'somevalue') { return 'Error message'; } } } });

有无数的内置验证器和模式可供您检查,甚至还有一种方法可以使用您自己的全局验证器来扩展列表。这个 Backbone 插件并没有让验证变得很有趣,但它确实消除了不添加验证的任何借口。请访问他们的网站以获取更多示例以及如何使用这个精彩工具的更深入说明。

Backbone.LayoutManager

Backbone.LayoutManager 就是为了让 Backbone 的视图变得更好。与 Backbone.Marionette 一样,它引入了清理代码以防止内存泄漏,处理所有样板文件,并只为您留下配置和特定于应用程序的代码。与 Marionette 不同,LayoutManager 特别关注视图。

因为 LayoutManager 仅关注视图,所以它可以比 Marionette 为视图做更多的事情。例如,当您想要从外部文件动态加载模板时,LayoutManager 能够执行异步渲染。

LayoutManager 还可以处理子视图,尽管方式与 Marionette 非常不同。但无论哪种方式,它主要是配置,这使得事情变得非常简单,并且消除了您需要做的 90% 的工作(如果您试图自己实现这一切)。请看下面一个向视图添加三个子视图的简单示例:

Backbone.Layout.extend({ views: { "header": new HeaderView(), "section": new ContentView(), "footer": new FooterView() } });

像往常一样,请务必参阅 GitHub 页面和文档以了解更多信息。

Backbone.ModelBinder

Backbone.ModelBinder 在模型中的数据和视图显示的标记之间创建链接。您已经可以通过绑定到模型上的更改事件并再次渲染视图来完成此操作,但 ModelBinder 更高效且更易于使用。

看一下下面的代码:

var MyView = Backbone.View.extend({ template: _.template(myTemplate), initialize: function() { // Old Backbone.js way this.model.on('change', this.render, this); // or the new Backbone 0.9.10+ way this.listenTo(this.model, 'change', this.render); }, render: function() { this.$el.html(this.template(this.model.toJSON())); } });

这种方法的问题在于,每当更改单个属性时,我们都需要重新渲染整个视图。此外,在每次渲染时,我们都需要将模型转换为 JSON。最后,如果希望绑定是双向的(当模型更新时,DOM 也会更新,反之亦然),那么我们需要向视图添加更多逻辑。

此示例使用 Underscore 的 template 函数。让我们假设我们传递给它的模板如下所示:

<form action="..."> <label for="firstName">First Name</label> <input type="text" id="firstName" name="firstName" value="<%= firstName %>"> <label for="lastName">Last Name</label> <input type="text" id="lastName" name="lastName" value="<%= lastName %>"> </form>

使用标签 使 template 函数将这些区域替换为我们从模型发送的 JSON 中存在的 firstName 和 lastName 属性。我们假设该模型也具有这两个属性。

使用 ModelBinder,我们可以删除这些模板标签并以普通 HTML 形式发送。 ModelBinder 将查看 input 标记上的 name 属性的值,并自动将该属性的模型值分配给该标记的 value 属性。例如,第一个 input 的 name 设置为“firstName”。当我们使用 ModelBinder 时,它会看到这一点,然后将 input 的 value 设置为模型的 firstName 属性。

下面,您将看到我们之前的示例在切换到使用 ModelBinder 后的外观。另外,要意识到绑定是双向的,因此如果 input 标签更新,模型将自动为我们更新。

HTML 模板:

<form action="..."> <label for="firstName">First Name</label> <input type="text" id="firstName" name="firstName"> <label for="lastName">Last Name</label> <input type="text" id="lastName" name="lastName"> </form>

JavaScript 视图:

var MyView = Backbone.View.extend({ template: myTemplate, initialize: function() { // No more binding in here }, render: function() { // Throw the HTML right in this.$el.html(this.template); // Use ModelBinder to bind the model and view modelBinder.bind(this.model, this.el); } });

现在我们有了干净的 HTML 模板,我们只需要一行代码就可以使用 modelBinder.bind 将视图的 HTML 和模型绑定在一起。 modelBinder.bind 采用两个必需参数和一个可选参数。第一个参数是将绑定到 DOM 的数据的模型。第二个是将递归遍历的 DOM 节点,搜索要进行的绑定。最后一个参数是 binding 对象,如果您不喜欢默认用法,它指定如何完成绑定的高级规则。

ModelBinder 不仅仅可以用于 input 标签。它适用于任何元素。如果元素是某种类型的表单输入,例如 input、select 或 textarea,它将相应地更新这些元素的值。如果您绑定到一个元素,例如 div 或 span,它会将模型的数据放置在该元素的开始和结束标记之间(例如 [数据在此处] )。

Backbone.ModelBinder 背后的功能比我在这里演示的要强大得多,因此请务必阅读 GitHub 存储库上的文档以了解所有相关信息。

结论

事情就这样结束了。我只介绍了少数扩展和插件,但这些是我认为最有用的。

Backbone 格局在不断变化。如果您想查看各种可用 Backbone 扩展的完整列表,请访问此 wiki 页面,Backbone 团队会定期更新该页面。

以上就是通过扩展增强主干以改善体验的详细内容,更多请关注知识资源分享宝库其它相关文章!

版权声明

本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • BioWare埃德蒙顿工作室面临关闭危机,龙腾世纪制作总监辞职引关注(龙腾.总监.辞职.危机.面临.....)

    BioWare埃德蒙顿工作室面临关闭危机,龙腾世纪制作总监辞职引关注(龙腾.总监.辞职.危机.面临.....)
    知名变性人制作总监corrine busche离职bioware,引发业界震荡!外媒“smash jt”独家报道称,《龙腾世纪:影幢守护者》制作总监corrine busche已离开bioware,此举不仅引发了关于个人职业发展方向的讨论,更因其可能预示着bioware埃德蒙顿工作室即将关闭而备受关注。本文将深入分析busche离职的原因及其对bioware及游戏行业的影响。 Busche的告别信:挑战与感激并存 据“Smash JT”获得的内部邮件显示,Busche离职原...
  • boss直聘怎么取消面试预约 boss直聘上面试爽约了会怎么样(面试.爽约.预约.取消.boss.....)

    boss直聘怎么取消面试预约 boss直聘上面试爽约了会怎么样(面试.爽约.预约.取消.boss.....)
    求职宝典:boss直聘面试技巧及取消预约方法 各位求职者注意啦!在Boss直聘上,随意取消面试预约会留下爽约记录,影响后续求职!本文将指导您如何避免爽约,以及如何取消已预约的面试。 如何取消Boss直聘面试预约? 打开Boss直聘APP,进入“我的”页面。 点击“待面试”,查看面试日程。 选择需要取消的面试,点击“取消面试”按钮即可。 Boss直聘面试爽约的后果? 爽约行为会在HR端留下记录,影响您的求职成功率。其他HR也能看到您的不良记录,所以务必重视面试预约。...
  • 闪耀暖暖靡城永恒怎么样-闪耀暖暖靡城永恒套装介绍(闪耀.暖暖.套装.介绍.....)

    闪耀暖暖靡城永恒怎么样-闪耀暖暖靡城永恒套装介绍(闪耀.暖暖.套装.介绍.....)
    闪耀暖暖钻石竞技场第十七赛季“华梦泡影”即将开启!全新闪耀性感套装【靡城永恒】震撼来袭!想知道如何获得这套精美套装吗?快来看看吧! 【靡城永恒】套装设计理念抢先看: 设计灵感源于夜色中的孤星,象征着淡然、漠视一切的灰色瞳眸。设计师希望通过这套服装,展现出在虚幻与真实交织的夜幕下,一种独特的魅力。 服装细节考究,从面料的光泽、鞋跟声响到裙摆的弧度,都力求完美还原设计初衷。 【靡城永恒】套装设计亮点: 闪耀的绸缎与金丝交织,轻盈的羽毛增添华贵感。 这套服装仿佛是从无尽的黑...
  • 蛋仔派对2025最新皮肤兑换码汇总 最新皮肤兑换码一览(兑换.皮肤.最新.派对.汇总.....)

    蛋仔派对2025最新皮肤兑换码汇总 最新皮肤兑换码一览(兑换.皮肤.最新.派对.汇总.....)
    蛋仔派对2025最新皮肤兑换码大放送!游戏内新增多款皮肤兑换码,包含最新、福利和通用三种类型,助你轻松获取精美奖励! 赶紧来看看如何兑换吧! 兑换码列表: 最新兑换码: ccewndj4k4k、cdkqdfm4fh、peetnmp4ef、cdxymk8f67 福利兑换码: cca863ywtfa、eggy2310am、eggy2311gz、eggyeggy9wz 通用兑换码: pec74dkcty、jsrqkrrjmh、cd3wt7wrph、ccepn7d8cjf...
  • python怎么调用其他文件函数

    python怎么调用其他文件函数
    在 python 中调用其他文件中的函数,有两种方式:1. 使用 import 语句导入模块,然后调用 [模块名].[函数名]();2. 使用 from ... import 语句从模块导入特定函数,然后调用 [函数名]()。 如何在 Python 中调用其他文件中的函数 在 Python 中,您可以通过以下两种方式调用其他文件中的函数: 1. 使用 import 语句 优点:简单且易于使用。 缺点:会将整个模块导入到当前作用域中,可能会导致命名空间混乱。 步骤:...