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

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

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

       準備工做:html

       本章代碼統一訪問項目chapter4_components下,項目代碼能夠在如下網址上找到:java

       https://github.com/ubuntuvim/my_emberjs_codegit

       https://git.oschina.net/chendequan/my_emberjs_code_2github

 

       與以前的文章同樣,項目仍然是使用Ember CLI命令建立項目和各個組件文件。json

 

       建立項目並測試運行,首先執行以下四條命令,最後在瀏覽器執行:http://localhost:4200/ubuntu

       ember new chapter4_componentsvim

       cd chapter4_components瀏覽器

       ember server

 

       若是你能在頁面上看到Welcome to Ember說明項目框架搭建成功!那麼你能夠繼續往下看了,不然想搭建好項目再往下學習~~~

 

1,自定義組件及使用

       建立組件方法很簡單:ember generate component my-component-name。一條命令便可,可是須要注意的是組件的名稱必需要包含中劃線「-」,好比blog-posttest-componentaudio-player-controls這種格式的命名是合法,可是posttest這種方式的命名是不合法的!其一是爲了防止用戶自定義的組件名與W3C規定的元素標籤名重複;其二是爲了確保Ember能自動檢測到用戶自定義的組件。

       下面定義一個組件,ember g component blog-postEmber CLI會自動爲你建立組件對應的的模板,執行這條命令以後你能夠在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標籤沒有變化。

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

說明:默認狀況下,自定義的組件會被渲染到div標籤內,固然這種默認狀況也是能夠修改的,比較簡單在此不過多介紹,請自行學習,網址:http://guides.emberjs.com/v2.0.0/components/customizing-a-components-element/

 

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}}的組件調用代碼。

       相信你應該瞭解了動態渲染組件是怎麼回事了!本身動手試試吧~~

 

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

 文章原網址:http://ibeginner.sinaapp.com/index.php?m=Home&c=Index&a=detail&id=4fd3ad852fa5d701c2b281bdfbe6bfd1

相關文章
相關標籤/搜索