<p style="text-align: center;"><strong><img alt="" src="https://simg.open-open.com/show/57a8ec1a6926357fef951dcf6a716756.png" /></strong></p> <p> </p> <p>Ember 是一个旨在创建非凡web应用的JavaScript框架,它消除了样板(boilerplate)并提供了标准的应用程序架构。</p> <p style="text-align: center;"><a href="https://simg.open-open.com/show/3904d750c9356b7f415fe7a3a9a1765e.png"><img alt="" src="https://simg.open-open.com/show/3904d750c9356b7f415fe7a3a9a1765e.png" /></a></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> </p> <p>这三个强大的工具是如何配合工作的:从一些原始的属性开始,然后使用计算属性构造一些更复杂的属性及其依赖关系。一旦你描述出数据,就只需要一次性指明数据是如何显示的,然后Ember即可帮你完成其余的任务。底层数据是如何改变的并不重要,不管是从XHR请求还是用户执行操作,你的用户界面总会保持实时更新。这消除了一大类开发人员每天为之挣扎的边缘情况。</p> <p> </p> <h2>更新日志</h2> <ul> <li><a href="/misc/goto?guid=4958995768740894050">#4518</a> Update the relationship docs to remove some references to a globals s…</li> <li><a href="/misc/goto?guid=4958995768858393671">#4581</a> [DOC] Update descriptions of findRecord() and findAll()</li> <li><a href="/misc/goto?guid=4958995768970948058">#4438</a> add <code>relationship</code> property to findHasMany RESTAdapter docs</li> <li><a href="/misc/goto?guid=4958995769077873556">#4283</a> Add better error messaging for adapters that do not implement createR…</li> <li><a href="/misc/goto?guid=4958995769196408623">#4440</a> Add examples to the Serializer API docs</li> <li><a href="/misc/goto?guid=4958995769320217855">#4272</a> [BUGFIX beta] Don't unnecessarily materialize records</li> <li><a href="/misc/goto?guid=4958995769433555986">#4562</a> [PERF] make internal model lazier</li> <li><a href="/misc/goto?guid=4958995769543068296">#4601</a> Naming cleanup</li> <li><a href="/misc/goto?guid=4958995769668523464">#4586</a> Remove the ds-boolean-transform-allow-null feature flag</li> <li><a href="/misc/goto?guid=4958995769776217802">#4582</a> tidy up integration/filter-test</li> <li><a href="/misc/goto?guid=4958995769893579807">#4585</a> Update changelog for the Ember Data 2.9.0 release</li> <li><a href="/misc/goto?guid=4958995770009980182">#4632</a> [DOC ds-extended-errors] Add docs for extended errors</li> <li><a href="/misc/goto?guid=4958994585703782044">#4592</a> [DOC] Add documentation for query#update() to refresh query</li> <li><a href="/misc/goto?guid=4958995770167365384">#4591</a> Cleanup record array manager</li> <li><a href="/misc/goto?guid=4958995770272916499">#4587</a> Remove ds-links-in-record-array feature flag</li> <li><a href="/misc/goto?guid=4958995770397015867">#4590</a> Fix YUIDoc warnings</li> <li><a href="/misc/goto?guid=4958995770506093300">#4589</a> Feat/improved cache</li> <li><a href="/misc/goto?guid=4958995770627094024">#4640</a> build ember-data attribute debug info dynamically</li> <li><a href="/misc/goto?guid=4958995770740753593">#4606</a> fix(instrumentation): heimdall-query needed bumped to work properly</li> <li><a href="/misc/goto?guid=4958995770857800171">#4599</a> Don't warn for 'async: false' relationships with link + data</li> <li><a href="/misc/goto?guid=4958995770972505911">#4594</a> Revert "unloadRecord does not remove observers"</li> <li><a href="/misc/goto?guid=4958995771100052882">#4605</a> Don't notify belongsTo changes if nothing changed</li> <li><a href="/misc/goto?guid=4958995771219230025">#4597</a> Cleanup record array manager</li> <li><a href="/misc/goto?guid=4958995771333564985">#4598</a> fix integration/record-array-test setup</li> <li><a href="/misc/goto?guid=4958995771443454885">#4600</a> make DS.ManyArray lazy</li> <li><a href="/misc/goto?guid=4958995771568397104">#4603</a> [WARNING] Warn when extending JSONAPISerializer with extractMeta</li> <li><a href="/misc/goto?guid=4958995771674330379">#4604</a> Warn when findRecord returns a different id than the one requested</li> <li><a href="/misc/goto?guid=4958995771788832564">#4659</a> Document the relationship serialized format in the RESTAdapter</li> <li><a href="/misc/goto?guid=4958995771910183133">#4624</a> Test assertions when updateRecord & deleteRecord don't exist on adapter</li> <li><a href="/misc/goto?guid=4958995772020597797">#4612</a> [DOC] Mark <code>errorsHashToArray</code> and <code>errorsArrayToHash</code> public</li> <li><a href="/misc/goto?guid=4958995772138110488">#4620</a> [FEATURE ds-serialize-id] add serializeId to json-serializer</li> <li><a href="/misc/goto?guid=4958995772246655213">#4613</a> Assert that InternalModel is indeed not materialized on store._push</li> <li><a href="/misc/goto?guid=4958995772359241286">#4616</a> Assert when original and not normalized key is found in payload</li> <li><a href="/misc/goto?guid=4958995772475033649">#4621</a> tidy-up integration/filter-test</li> <li><a href="/misc/goto?guid=4958995772598218569">#4617</a> chore(store): cleans up and optimizes code paths around fetching rela…</li> <li><a href="/misc/goto?guid=4958995772704145347">#4607</a> Fix dummy app serializer</li> <li><a href="/misc/goto?guid=4958995772822918215">#4609</a> [DOC] Improve warning for mismatched id in store.findRecord</li> <li><a href="/misc/goto?guid=4958995772927526411">#4614</a> [DOC] Minor changes to addon/serializer.js</li> <li><a href="/misc/goto?guid=4958995773052302147">#4671</a> Fix typo in delete-record-test</li> <li><a href="/misc/goto?guid=4958995773163051912">#4645</a> cleanup system/many-array</li> <li><a href="/misc/goto?guid=4958995773285412498">#4636</a> Add a missing example to the ManyArray api docs</li> <li><a href="/misc/goto?guid=4958995773389224659">#4630</a> Updates json-api-mock-server</li> <li><a href="/misc/goto?guid=4958995773514492838">#4644</a> [PERF] HasMany doesn't need to inform RecordArrayManager</li> <li><a href="/misc/goto?guid=4958995773624157657">#4629</a> [DOC] <a href="/misc/goto?guid=4958995773745265041">#4595</a> revise unloadAll description</li> <li><a href="/misc/goto?guid=4958995773865007393">#4641</a> Add API docs for the RecordReference</li> <li><a href="/misc/goto?guid=4958995773976621476">#4639</a> Update API docs for BelongsToReference</li> <li><a href="/misc/goto?guid=4958995774100012404">#4643</a> [BUGFIX <a href="/misc/goto?guid=4958995774190390625">#4649</a> <a href="/misc/goto?guid=4958995774295795823">#4648</a>]</li> <li><a href="/misc/goto?guid=4958995774390222964">#4637</a> Simplify Adapter#serialize by using snapshot.serialize() since they d…</li> <li><a href="/misc/goto?guid=4958995774484031053">#4661</a> dirty check to prevent liveRecordArrays being rebuilt too often</li> <li><a href="/misc/goto?guid=4958995774584283804">#4665</a> Deprecate store.recordIsLoaded</li> <li><a href="/misc/goto?guid=4958995774676226858">#4654</a> remove useless private api</li> <li><a href="/misc/goto?guid=4958995774787985360">#4653</a> Update the API docs on the JSONAPISerializer</li> <li><a href="/misc/goto?guid=4958995774880374685">#4652</a> Improve the API docs for the JSONAPI adapter</li> <li><a href="/misc/goto?guid=4958995774981178199">#4662</a> Code Cleanup for store.js</li> <li><a href="/misc/goto?guid=4958995775070953127">#4651</a> Add some minor updates to the store documentation</li> <li><a href="/misc/goto?guid=4958995775152603853">#4658</a> Test for hasMany array removal on deletion</li> <li><a href="/misc/goto?guid=4958995775244906206">#4669</a> fix mock server</li> <li><a href="/misc/goto?guid=4958995775327340978">#4674</a> Update <code>findHasMany</code> API docs</li> <li><a href="/misc/goto?guid=4958995775413400215">#4680</a> Remove unused helper function <code>normalizeAttributes</code></li> </ul> <h2>下载</h2> <ul> <li><a href="/misc/goto?guid=4958995775499189126" rel="nofollow"><strong>Source code</strong> (zip)</a></li> <li><a href="/misc/goto?guid=4958995775593970457" rel="nofollow"><strong>Source code</strong> (tar.gz)</a></li> </ul> <p>本站原创,转载时保留以下信息:<br /> 本文转自:深度开源(open-open.com)<br /> 原文地址:<a href="http://www.open-open.com/news/view/2e5936b9">http://www.open-open.com/news/view/2e5936b9</a></p>