1. 程式人生 > >Ember.js 入門指南——元件定義

Ember.js 入門指南——元件定義

    不得不說,Ember的更新是在是太快了!!本教程還沒寫到一半就又更新到v2.1.0了!!!!不過為了統一還是使用官方v2.0.0的參考文件!!

       從本篇開始進入新的一章——元件。這一章將用6篇文章介紹Ember的元件,從它的定義開始知道它的使用方式,我將為你一一解答!

       準備工作:

       本章程式碼統一訪問專案chapter4_components下,專案程式碼可以在以下網址上找到:

       與之前的文章一樣,專案仍然是使用Ember CLI命令建立專案和各個元件檔案。

       ember new chapter4_components

       cd chapter4_components

       ember server

       如果你能在頁面上看到Welcome to Ember說明專案框架搭建成功!那麼你可以繼續往下看了,否則想搭建好專案再往下學習~~~

1,自定義元件及使用

       建立元件方法很簡單:ember generate component my-component-name。一條命令即可,但是需要注意的是元件的名稱必須要包含中劃線“-”,比如blog-posttest-componentaudio-player-controls這種格式的命名是合法,但是post

test這種方式的命名是不合法的!其一是為了防止使用者自定義的元件名與W3C規定的元素標籤名重複;其二是為了確保Ember能自動檢測到使用者自定義的元件。

下面定義一個元件,ember g component blog-post會自動為你建立元件對應的的模板,執行這條命令之後你可以在app/componentsapp/templates/components下看到建立的檔案。

<!--  app/templates/components/blog-post.hbs  -->
 
<article>
       <h1>{{title}}</h1>
       <p>{{yield}}</p>
       <p>Edit title: {{input type="text" value=title}}</p>
</article>

       為了演示元件的使用需要做些準備工作:

       ember g route index

//  app/routes/index.js
 
import Ember from 'ember';
 
export default Ember.Route.extend({
      
       model: function() {
               return [
                 { id: 1, title: 'Bower: dependencies and resolutions new', body: "In the bower.json file, I see 2 keys dependencies and resolutionsWhy is that so? I understand Bower has a flat dependency structure. So has it got anything to do with that ?", category: 'java' },
                 { id: 2, title: 'Highly Nested JSON Payload - hasMany error', body: "Welcome to the Ember.js discussion forum. We're running on the open source, Ember.js-powered Discourse forum software. They are also providing the hosting for us. Thanks guys! Please use this space for discussion abo… read more", category: 'php' },
                 { id: 3, title: 'Passing a jwt to my REST adapter new ', body: "This sets up a binding between the category query param in the URL, and the category property on controller:articles. In other words, once the articles route has been entered, any changes to the category query param in the URL will update the category property on controller:articles, and vice versa.", category: 'java'}
           ];
         
       }
});
<!-- app/templates/index.hbs  -->
 
{{#each model as |item|}}
       <!-- 使用自定義的元件blog-post -->
       {{#blog-post title=item.title}}
              {{item.body}}
       {{/blog-post}}
{{/each}}

    在這段程式碼中,使用了自定義的元件來顯示資料。最後頁面顯示如下:

看看生成的HTML程式碼:

自定義的元件被渲染到了模板index.hbs使用blog-post的地方。並且自定義元件的HTML標籤沒有變化。

到這裡大概應該知道怎麼去使用元件了,至於它是怎麼就渲染到了使用元件的地方,以及它是怎麼渲染上去的。別急~~後面的文章會為你一一解答。

2,自定義元件類

       使用者自定義的元件類都需要繼承Ember.Component類。

       通常情況下我們會把經常使用的模板片段封裝成元件,只需要定義一次就可以在專案任何一個模板中使用,而且不需要編寫任何的javascript程式碼。比如上述第一點自定義元件及使用中描述的一樣。

       但是如果你想你的元件有特殊的行為,並且這些行為是預設元件類無法提供的(比如:改變包裹元件的標籤、響應元件模板初始化某個狀態等),那麼此時你可以自定義元件類,但是要繼承Ember.Component,如果你自定義的元件類沒有繼承這個類,你自定義的元件就很有可能會出現一些不可預知的問題。

       Ember所能識別的自定義元件類的名稱是有規範的。比如,你定義了一個名為blog-post的元件,那麼你的元件類的名稱應該是app/components/blog-post.js。如果元件名為audio-player-controls那麼對應的元件類名為app/components/audio-player-controls.js。即:元件類名與元件同名,這個是v2.0的命名方法,請區別就版本的Ember,舊版本的元件命名規則是駝峰式的命名規則。

舉個簡單的例子,在第一點自定義元件及使用中講過,元件預設會被渲染到div標籤內,你可以在元件類中修改這個預設標籤。

//  app/components/blog-post.js
 
import Ember from 'ember';
 
export default Ember.Component.extend({
       tagName: 'nav'
});

這段程式碼修改了包裹元件的標籤名,頁面重新整理後HTML程式碼如下:

可以看到元件的HTML程式碼被包含在nav標籤內。

3,動態渲染元件

       元件的動態渲染與Java的多型有點相似。{{component}}助手會延遲到執行時才決定使用那個元件渲染頁面。當程式需要根據資料不同渲染不同元件的時,這種動態渲染就顯得特別有用。可以使你的邏輯和試圖分離開。

       那麼要怎麼使用呢?非常簡單,只需要把元件名作為引數傳遞過去即可,比如:使用{{component ‘blog-post’}}{{blog-post}}結果是一致的。我們可以修改第一點自定義元件及使用例項中模板index.hbs的程式碼。

<!-- app/templates/index.hbs  -->
 
{{#each model as |item|}}
       <!-- 使用自定義元件的另一種方式(動態渲染元件方式) -->
       {{component 'blog-post' title=item.title}}
       {{item.body}}
{{/each}}

頁面重新整理之後,可以看到結果是一樣的。

       下面為讀者演示如何根據資料不同渲染不同的元件。

       按照慣例,先做好準備工作,使用Ember CLI命令建立2個不同的元件。

       ember g component foo-component

       ember g component bar-component

<!-- app/templates/components/bar-component.hbs -->
 
<h1>Hello from bar</h1>
<p>{{post.body}}</p>

       為何能用post獲取資料,因為在使用元件的地方傳遞了引數。在模板index.hbs中可以看到。

<!-- app/templates/components/foo-component.hbs -->
 
<h1>Hello from foo</h1>
<p>{{post.body}}</p>

       修改顯示的資料,注意資料的最後增加一個屬性pnpn的值就是元件的名稱。

//  app/routes/index.js
 
import Ember from 'ember';
 
export default Ember.Route.extend({
 
       model: function() {
               return [
                 { id: 1, title: 'Bower: dependencies and resolutions new', body: "In the bower.json file, I see 2 keys dependencies and resolutionsWhy is that so? I understand Bower has a flat dependency structure. So has it got anything to do with that ?", pn: 'bar-component' },
                 { id: 2, title: 'Highly Nested JSON Payload - hasMany error', body: "Welcome to the Ember.js discussion forum. We're running on the open source, Ember.js-powered Discourse forum software. They are also providing the hosting for us. Thanks guys! Please use this space for discussion abo… read more", pn: 'foo-component' },
                 { id: 3, title: 'Passing a jwt to my REST adapter new ', body: "This sets up a binding between the category query param in the URL, and the category property on controller:articles. In other words, once the articles route has been entered, any changes to the category query param in the URL will update the category property on controller:articles, and vice versa.", pn: 'bar-component'}
           ];
         
       }
});

       修改呼叫元件的模板index.hbs

<!-- app/templates/index.hbs  -->
 
{{#each model as |item|}}
       <!-- 根據元件名渲染不同的元件,第一個引數是元件名,第二個引數為傳遞到元件上顯示的資料 -->
       {{component item.pn post=item}}
{{/each}}

       模板編譯之後會得到形如{{component foo-component post}}的元件呼叫程式碼。

       相信你應該瞭解了動態渲染元件是怎麼回事了!自己動手試試吧~~

到此元件的定義與使用介紹完畢了,不知道你有沒有學會呢?如果你有疑問請給我留言或者直接看官方教程學習。

相關推薦

Ember.js 入門指南——元件定義

    不得不說,Ember的更新是在是太快了!!本教程還沒寫到一半就又更新到v2.1.0了!!!!不過為了統一還是使用官方v2.0.0的參考文件!!        從本篇開始進入新的一章——元件。這一章將用6篇文章介紹Ember的元件,從它的定義開始知道它的使用方式,

Ember.js 入門指南——路由定義

    當你的應用啟動的時候,路由器就會匹配當前的URL到你定義的路由上。然後按照定義的路由層次逐個載入資料、設定應用程式狀態、渲染路由對應的模板。 1,基本路由         在app/router.js的map方法裡定義的路由會對映到當前的URL。當map方法被

Ember.js 入門指南 (二)

@(Ember)[MVVM|前端框架|HTML桌面應用] 序言 經常有人質疑,在前端搞MV*有什麼意義?也有人跟我提出這樣的疑問:以AngularJS,Knockout,BackBone為代表的MV*框架,它跟jQuery有什麼區別?我jQuery用

Ember.js 入門指南——處理事件

ber.js 入門指南——處理事件        你可以在元件中響應事件,比如使用者的雙擊、滑鼠滑過、鍵盤的按下等等事件。只需要在元件類中增加Ember提供的處理事件,然後Ember會自動判斷使用者的操作執行相應的事件,只要在元件類中新增的事件不衝突你甚至一次性增加多個

Ember.js 入門指南——控制器(controller)

ember new chapter5_controllers cd chapter5_controllers ember server 從本篇開始進入第五章控制器,controller在Ember2.0開始越來越精簡了,職責也更加單一——處理邏輯。 下面是準備工作。

Ember.js 入門指南——非同步路由

本文將為你介紹路由的高階特性,這些高階特性可以用於處理專案複雜的非同步邏輯。 關於單詞promises,直譯是承諾,但是個人覺得還是使用原文吧。讀起來順暢點。 1,promises(承諾)        Ember的路由處理非同步邏輯的方式是使用promises。簡

Ember.js 入門指南——新建、更新、刪除記錄

前一篇介紹了查詢方法,本篇介紹新建、更新、刪除記錄的方法。 本篇的示例程式碼建立在上一篇的基礎上。對於整合firebase、建立route和template請參看上一篇,增加一個controller:ember g controller articles。 1,新建

Ember.js 入門指南——{{action}} 助手

action助手所現實的功能與javascript裡的事件是相似的,都是通過使用者點選元素觸發定義在元素上的事件。Ember的action助手還允許你傳遞引數到對應的controller、component類,在controller或者component上處理事件的邏輯。

Ember.js 入門指南——工具類的助手

    本篇主要介紹格式轉換、自定義helper、自定義helper引數、狀態helper、HTML標籤轉義這幾個方面的東西。 按照文章慣例先準備好測試所需要的資料、檔案。仍然是使用Ember CLI命令,這次我們建立的是helper、controller、route

Ember.js 入門指南——繫結(bingding)

    ​正如其他的框架一樣Ember也包含了多種方式繫結實現,並且可以在任何一個物件上使用繫結。也就是說,繫結大多數情況都是使用在Ember框架本身,對於開發最好還是使用計算屬性。 1,雙向繫結 // 雙向繫結 Wife = Ember.Object.extend(

Ember.js 入門指南——路由切換的防止和重試

    在路由的切換過程中,Ember路由器會通過回撥(beforeModel、model、afterModel、redirect)解析一個transition物件到切換的下一路由中。任何一個回撥都可以通過傳遞過來的transition引數獲取transition物件,然

Ember.js 入門指南——表單元素

Ember提供的表單元素都是經過封裝的,封裝成了view元件。經過解析渲染之後就會生成普通的HTML標籤。更多詳細資訊你可以檢視他們的實現原始碼:Ember.TextField、Ember.Chechbox、Ember.TextArea。        按照慣例,先建

Ember.js 入門指南——{{link-to}} 助手

1,link-to助手常規使用 link-to助手錶達式渲染之後就是一個a標籤。而a標籤的href屬性的值是根據路由生成的,與路由的設定是息息相關的。並且每個設定的路由名稱都是有著對應的關係的。 為了演示效果,用命令生成了一個route(或者手動建立檔案)並獲取測試資

易學筆記-第2部分 Node.js入門指南/第5章 Node.js在幣圈流行麼

第2部分 Node.js入門指南/第5章 Node.js在幣圈流行麼/5.1 Node.js在開源社群很流行 Node.js在開源社群很流行 概念:JavaScript大部分專案都是建立在Node.js平臺之上的 在Github上專案採用的語言統計,JavaScr

three.js 入門指南(敷衍一下)

今天看了一本好書three.js,感覺特別適合我這種對three.js 瞭解不深的人。 其實要學習three.js,還有許多其他方面的知識要了解,例如如何繪製多邊形,如何繪製曲線,攝像機的一些基礎知識等等。 推薦一本老外的three.js指南 https://pan.baidu.com/

node js 入門指南

-type ctu tor tex UNC erp func ons 消息 一旦你已經安裝了 Node,讓我們嘗試構建第一個 Web 服務器。 請創建一個“app.js”文件,黏貼以下代碼: const http = require(‘http‘)

JavaScript入門:006—JS函數的定義

括號 obj int() 對象 rip js函數 返回值 部分 hint JS函數的聲明。聲明函數的格式例如以下:function 函數名(參數列表){ //函數語句; return 返回值; }來看詳細的函數聲明。1、普通函數<script type=&qu

Vue.js新手入門指南

最近在逛各大網站,論壇,以及像SegmentFault等程式設計問答社群,發現Vue.js異常火爆,重複性的提問和內容也很多,樓主自己也趁著這個大前端的熱潮,著手學習了一段時間的Vue.js,目前用它正在做自己的結業專案。 在做的過程中也對Vue.js的官方文件以及其各種特性有了許多認識。作為一個之

pdf.js 入門使用指南4-手機端瀏覽pdf(touch.js)

經過測試,使用pdf.js這個開源庫,自己編寫程式碼實現pdf 檔案瀏覽也不是很複雜。參照我以前的blog文章,如果要實現上一頁,下一頁,旋轉等都非常簡單。 但是,手機端是個比較依賴手勢特殊存在。如果要實現如下功能: 1:雙指放大,通過捏合雙指進行放大或縮小 2:單個手指

pdf.js 入門使用指南3-字型顯示問題

1:亂碼問題。最近遇到一個問題,一個pdf 檔案使用了冷門的字型,導致出現亂碼,字型空白,如下圖所示 2:問題排查,初步排查,治標。    修改改pdf 檔案,把字型都修改成宋體。再次預覽,顯示正常 。     3:從問題上根治這個問