摘要:博文原址從服務器獲取數據,引入組件接著前面四篇環境搭建以及使用創建第一個靜態頁面引入計算屬性動態內容模型,保存數據到數據庫發布項目,加入功能清理模板,使用組件重構版本之后組件會越來越重要。
博文原址:從服務器獲取數據,引入組件
接著前面四篇:
環境搭建以及使用Ember.js創建第一個靜態頁面
引入計算屬性、action、動態內容
模型,保存數據到數據庫
發布項目,加入CRUD功能
清理模板,使用組件重構2.0版本之后組件會越來越重要。有關組件的介紹請看Ember.js 入門指南之二十八組件定義。組件的創建同樣可以使用Ember CLI命令創建。如下命令創建了2個組件,創建的同時會自動創建2個文件;一個是組件類(app/components/xxx.js)。一個是組件對應的模板(app/templates/components/xxx.hbs)。
ember g component library-item ember g component library-item-form
修改模板library-item
下面在組件模板library-item.hbs中增加如下代碼:
{{item.name}}
Address: {{item.address}}
Phone: {{item.phone}}
如果注意看可以發現上述代碼與app/templates/libraries/index.hbs文件的代碼非常相似。這是item替代了model。至于item是怎么來的請看Ember.js 入門指南之二十九屬性傳遞,這篇博文介紹了組件的屬性傳遞,item是從調用組件的模板傳遞過來的。上述代碼中還有一個重要的東西是{{yield}},這個表達式與{{outlet}}類似。同樣也是一個占位符。組件渲染之后會被傳進來的html代碼替換。比如下面的調用代碼:
{{#library-item item=model}} Closed {{/library-item}}
組件渲染之后,上述的Closed會替換到{{yield}}這里,最終得到的html代碼如下:
有關組件渲染的內容請看Ember.js 入門指南之三十包裹內容。
修改模板library-item-form
{{input type="text" value=item.name class="form-control" placeholder="The name of the Library"}} {{#if item.isValid}}{{/if}}{{input type="text" value=item.address class="form-control" placeholder="The address of the Library"}}{{input type="text" value=item.phone class="form-control" placeholder="The phone number of the Library"}}
注意觀察上述代碼與libraries/new.hbs和libraries/edit.hbs幾乎是一樣的。有點不一樣的是把校驗移到model中。比如校驗name屬性不為空。
注意:頂部導入的代碼。
import Model from "ember-data/model"; import attr from "ember-data/attr"; import Ember from "ember"; export default Model.extend({ name: attr("string"), address: attr("string"), phone: attr("string"), isValid: Ember.computed.notEmpty("name") });
再修改app/templates/libraries/index.hbs引入組件。
List
{{#each model as |library|}}{{#library-item item=library}} {{#link-to "libraries.edit" library.id class="btn btn-success btn-xs"}}Edit{{/link-to}} {{/library-item}}{{/each}}
在迭代中使用組件,通過屬性名item傳遞迭代出來的對象library到組件中。其中link-to和button這兩句代碼會替換到組件library-item的{{yield}}上。
等待項目重啟完成,可以看到界面與之前的沒有任何變化。頁面是沒有變化,但是后臺的處理還需要完善。
修改app/templates/libraries/new.hbs
Add a new local Library
{{library-item-form item=model buttonLabel="Add to library list" action="saveLibrary"}}{{#library-item item=model}}
{{/library-item}}
修改app/templates/libraries/edit.hbs
Edit Library
{{library-item-form item=model buttonLabel="Save changes" action="saveLibrary"}}{{#library-item item=model}}
{{/library-item}}
在組件類library-item-form.js增加對action的處理。
import Ember from "ember"; export default Ember.Component.extend({ buttonLabel: "Save", actions: { buttonClicked(param) { this.sendAction("action", param); } } });合并edit.hbs和new.hbs到form.hbs
原來的文件edit.hbs和new.hbs幾乎是一樣的,可以使用組件重構。
{{title}}
{{library-item-form item=model buttonLabel=buttonLabel action="saveLibrary"}}{{#library-item item=model}}
{{/library-item}}
為了實現代碼復用,首先把不同的部分定義成屬性:title、buttonLabel。默認情況下路由會渲染到同名的模板上,如果你想修改這個默認行為可以使用renderTemplate()方法。
使用方法renderTemplate()和setupController()API介紹
renderTemplate()
setupController()
默認情況下路由會渲染到同名的模板上,我們使用方法renderTemplate()執行渲染的模板。比如下面的代碼使用這個方法執行路由new渲染到模板libraries/form.hbs。
// app/routes/libraries/new.js import Ember from "ember"; export default Ember.Route.extend({ model: function () { return this.store.createRecord("library"); }, setupController: function (controller, model) { this._super(controller, model); controller.set("title", "Create a new library"); controller.set("buttonLabel", "Create"); }, renderTemplate() { this.render("libraries/form"); }, actions: { saveLibrary(newLibrary) { newLibrary.save().then(() => this.transitionTo("libraries")); }, willTransition() { let model = this.controller.get("model"); if (model.get("isNew")) { model.destroyRecord(); } } } });
注意方法setupController()設置組件模板中的屬性title和buttonLabel的值。同樣的在修改路由edit.js。
// app/routes/libraries/edit.js import Ember from "ember"; export default Ember.Route.extend({ model(params) { return this.store.findRecord("library", params.library_id); }, setupController(controller, model) { this._super(controller, model); controller.set("title", "Edit library"); controller.set("buttonLabel", "Save changes"); }, renderTemplate() { this.render("libraries/form"); }, actions: { saveLibrary(newLibrary) { newLibrary.save().then(() => this.transitionTo("libraries")); }, willTransition(transition) { let model = this.controller.get("model"); if (model.get("hasDirtyAttributes")) { let confirmation = confirm("Your changes haven"t saved yet. Would you like to leave this form?"); if (confirmation) { model.rollbackAttributes(); } else { transition.abort(); } } } } });
使用組件重構之后可以刪除app/templates/libraries/new.hbs和app/templates/libraries/edit.hbs,這兩個文件不需要了。效果截圖如下:
使用組件nav-link-to重構知道組件如何使用之后我們繼續重構項目代碼,重構導航模板navbar.hbs的鏈接代碼。使用Ember CLI命令創建組件。
ember g component nav-link-to
這次使用擴展的方式擴展一個組件類,擴展Ember內置的組件類LinkComponent,使用方法extend()擴展一個類。然后使用屬性tagName指定渲染之后的標簽。更多有關組件屬性的介紹請看Ember.js 入門指南之三十一自定義包裹組件的HTML標簽,當然你也可以參考網址的教程實現本文的需求。
// app/components/nav-link-to.js import Ember from "ember"; export default Ember.LinkComponent.extend({ tagName: "li" });
注意:記得修改Ember.Component.extend為Ember.LinkComponent.extend。組件模板很簡單。
{{yield}}
最后在修改導航模板navbar.hbs為如下內容:
等待項目重啟完成,可以看到界面與之前的沒有任何變化,可以任意點擊導航欄菜單且不會出錯。效果截圖如下:
家庭作業本篇的家庭作業就是好好理解組件!參考下面的文章認真學習、理解組件。
Ember.js 入門指南之二十八組件定義
Ember.js 入門指南之二十九屬性傳遞
Ember.js 入門指南之三十包裹內容
Ember.js 入門指南之三十一自定義包裹組件的HTML標簽
Ember.js 入門指南之三十二處理事件
Ember.js 入門指南之三十三action觸發變化
為了照顧懶人我把完整的代碼放在GitHub上,如有需要請參考參考。博文經過多次修改,博文上的代碼與github代碼可能有出入,不過影響不大!如果你覺得博文對你有點用,請在github項目上給我點個star吧。您的肯定對我來說是最大的動力!!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79533.html
摘要:發布通過回調方法向發布事件。觀察者一個回調函數的集合,它知道如何去監聽由提供的值。 本文目錄 一、項目起步 二、編寫路由組件 三、編寫頁面組件 1.編寫單一組件 2.模擬數據 3.編寫主從組件 四、編寫服務 1.為什么需要服務 2.編寫服務 五、引入RxJS 1.關于RxJS 2.引入RxJS 3.改造數據獲取方式 六、改造組件 1.添...
摘要:編寫單一組件我們首先寫一個書本信息的組件,代碼如下單個課本像火焰像灰燼程姬知識點是一個的復寫器指令,就像中的和中的。寫到這里,看看我們項目,還是一樣正常在運行,只是現在項目中組件分工更加明確了。 本文目錄 一、項目起步 二、編寫路由組件 三、編寫頁面組件 1.編寫單一組件 2.模擬數據 3.編寫主從組件 四、編寫服務 1.為什么需要服務 2.編寫服務 五、...
摘要:它賦予了僅僅使用純粹的就可以創建可重用組件的能力。我們會用到的來創建我們的用戶卡片。在較早版本的瀏覽器中,我們不能使用來隔離組件。這可以部分歸咎于對的影響很大的。你可以在這里閱讀第二部分的教程使用純粹的構建 原文鏈接:https://ayushgp.github.io/htm...譯者:阿里云 - 也樹 Web Component 出現有一陣子了。 Google 費了很大力氣去推動它更...
摘要:它賦予了僅僅使用純粹的就可以創建可重用組件的能力。我們會用到的來創建我們的用戶卡片。在較早版本的瀏覽器中,我們不能使用來隔離組件。這可以部分歸咎于對的影響很大的。你可以在這里閱讀第二部分的教程使用純粹的構建 原文鏈接:https://ayushgp.github.io/htm...譯者:阿里云 - 也樹 Web Component 出現有一陣子了。 Google 費了很大力氣去推動它更...
閱讀 2205·2021-10-13 09:39
閱讀 3408·2021-09-30 09:52
閱讀 800·2021-09-26 09:55
閱讀 2775·2019-08-30 13:19
閱讀 1888·2019-08-26 10:42
閱讀 3185·2019-08-26 10:17
閱讀 543·2019-08-23 14:52
閱讀 3631·2019-08-23 14:39