Ember.Js v2.9.0-alpha.3发布,一个JavaScript框架
jopen 8年前
<p style="text-align: center;"><img alt="" src="https://simg.open-open.com/show/57a8ec1a6926357fef951dcf6a716756.png" /></p> <p>Ember 是一个旨在创建非凡web应用的JavaScript框架,它消除了样板(boilerplate)并提供了标准的应用程序架构。</p> <p style="text-align: center;"><img alt="" src="https://simg.open-open.com/show/3904d750c9356b7f415fe7a3a9a1765e.png" /></p> <h2>消除样板</h2> <p>每个web应用中都会有些常规的任务。例如,从服务器取数据、将数据渲染到屏幕、然后当数据变更时更新信息。由于浏览器能够提供的完成该任务的工具太过原始,致使你一遍一遍地书写相同的代码。Ember.js提供的工具可以让你专注于你的app,而不是重复地编写已经写过无数次的代码。因为我们自己已经创建过数十个应用,我们已经远远超越了明显低级的事件驱动(event-driven)的抽象概念,消除了大量贯穿于应用当中的、与传播变化相关联的样板,尤其是DOM本身。为了帮助你管理视图(view)中的变更,Ember.js内置了一个模板引擎,当底层的对象发生改变时它可以自动地更新DOM。与其他任何的模板系统类似,模板初始渲染时会影响到person的当前状态。然而,为了避免样板,当person的name更新时Ember.js也会为你自动更新DOM。一次性指定模板,Ember.js就会确保它实时更新。</p> <h2>提供架构</h2> <p>由于web应用是由web页面演变而来,其不过是静态文档而已,浏览器已赋予你充分的能力去做任何想做的事。Ember可以让你很容易地将应用划分为模型(models),视图(views)和控制器(controllers),从而提高了可测性,使代码更加模块化,并且帮助项目中的新手快速理解各部分的结合原理。意面式的回调(callback spaghetti)时代结束了。Ember同样提供了内置的对状态管理的支持,从而可以描述你的应用程序在各种不同的嵌套状态(比如登入登出,浏览文章,查看评论)间的流转。</p> <h2>Ember.js 有何不同?</h2> <p>传统的web应用迫使用户在每次与服务器交互时都得下载一个新页面。这意味着每次交互的时间不可能比你到用户之间的延时更快了,并且往往更慢。使用AJAX替换页面中的一些部分,在一定程度上起到了作用,但是在每次UI需要更新时,仍然需要一次到服务器的往返。并且如果页面中的许多部分需要同时更新,绝大部分开发者又会采取重新载入页面的方式了,因为若想保持每个部分都同步还真是个技术活。与一些其他的现代JavaScript框架类似,Ember.js的工作方式略有不同。Ember.js应用会在页面初始载入时将所需全部加在,而不是将大多数应用逻辑存放于服务器端。这意味着当用户使用你的app时,她完全不必载入新页面,并且你的UI会快速响应交互操作。这种架构的一个优点就是,你的web应用与本地(native)应用或者第三方客户端使用相同的REST API。后端开发者可以专注于构建一个快速,稳定,安全的API服务器,并且也不需要前端经验。</p> <h2>Ember.js 概览</h2> <p>三个法宝让你快乐地使用Ember:</p> <ul> <li>绑定(Bindings)</li> <li>计算属性(Computed properties)</li> <li>自动更新模板(Auto-updating templates)</li> </ul> <h3>绑定</h3> <p>使用绑定可以使两个不同对象的属性保持同步。你只需一次性声明绑定,然后Ember就会确保变更的双向传播。绑定允许你以MVC(Model-View-Controller)模式架构你的应用,然后即可高枕无忧了,数据将永远正确地在层与层之间流动。</p> <h3>计算属性</h3> <p>计算属性非常有用,因为它可以像其他任何属性一样与绑定一起使用。许多计算出的属性依赖于其他属性。许多计算出的属性依赖于其他属性。</p> <h3>自动更新模板</h3> <p>模板是可感知绑定(bindings-aware)的。意思就是如果你改变了已经告知我们需要显示的属性值,我们会为你自动更新。并且由于你指定了依赖关系,对那些属性的更改也会体现出来。</p> <p>这三个强大的工具是如何配合工作的:从一些原始的属性开始,然后使用计算属性构造一些更复杂的属性及其依赖关系。一旦你描述出数据,就只需要一次性指明数据是如何显示的,然后Ember即可帮你完成其余的任务。底层数据是如何改变的并不重要,不管是从XHR请求还是用户执行操作,你的用户界面总会保持实时更新。这消除了一大类开发人员每天为之挣扎的边缘情况。</p> <h2>更新日志</h2> <ul> <li><a href="/misc/goto?guid=4958992799659456430" title="[Glimmer 2] Removal of "always dirty" re-rendering">#13946</a>: Re-rendering a component manually (i.e. calling <code>this.rerender()</code>) no longer forces everything in its subtree to recompute. Notably, helpers like <code>{{unbound}}</code> are not updated when re-rendering.</li> <li><a href="/misc/goto?guid=4958992799767285628">#13947</a>: The <code>willRender</code> lifecycle hook will be called on a component whenever <em>anything</em> in its subtree has changed.</li> <li><a href="/misc/goto?guid=4958992799871706732">#13948</a>: "Backtracking re-render" is now an error in development mode, and will not work in production builds.</li> <li><code>{{#each-in}}</code> updates automatically when values are added to the object using <code>Ember.set</code>.</li> <li>"Tagless" components (components with <code>tagName</code> set to an empty string) used to ignore any <code>id</code>attribute, which unintentionally allowed users to repurpose it for their own uses. This is now a hard error ("You cannot use <code>elementId</code> on a tag-less component").</li> <li><a href="/misc/goto?guid=4958992799976416663">更多日志</a></li> </ul> <h2>下载</h2> <ul> <li><a href="/misc/goto?guid=4958993006404147069" rel="nofollow"><strong>Source code</strong> (zip)</a></li> <li><a href="/misc/goto?guid=4958993006501150984" rel="nofollow"><strong>Source code</strong> (tar.gz)</a></li> </ul> <p> </p> <p>本站原创,转载时保留以下信息:<br /> 本文转自:深度开源(open-open.com)<br /> 原文地址:<a href="http://www.open-open.com/news/view/65237a6c">http://www.open-open.com/news/view/65237a6c</a></p> <p> </p>