<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3309933229809673500</id><updated>2024-09-29T17:32:24.707+08:00</updated><category term="Java WEB"/><category term="framework"/><category term="Java"/><category term="AngularJS"/><category term="Hibernate"/><category term="javascript"/><category term="JSP"/><category term="android"/><category term="struts"/><category term="Flex"/><category term="React.js"/><category term="Spring"/><category term="網路"/><category term="Eclipse"/><category term="Solr"/><category term="設計模式"/><category term="資料庫"/><category term="DWR"/><category term="測試"/><category term="C and C#"/><category term="Jasmine"/><category term="Karma"/><category term="NodeJS"/><category term="ZK"/><category term="browserify"/><category term="flux"/><category term="iBatis"/><category term="pureMVC"/><category term="Axis2"/><category term="BlazeDS"/><category term="ECMAScript 6"/><category term="Thread"/><category term="Web Services"/><category term="babel"/><category term="執行緒"/><category term="Grunt"/><category term="Hadoop"/><category term="JACOB"/><category term="jquery"/><category term="教學"/><category term="視窗"/><category term="ActiveX"/><category term="Bootstrap"/><category term="Express"/><category term="HBase"/><category term="Heroku"/><category term="MongoDB"/><category term="NoSQL"/><category term="Shippable"/><category term="SolrJ"/><category term="Spark"/><category term="Table"/><category term="cordova"/><category term="debowerify"/><category term="gulp"/><category term="iText"/><category term="xml"/><category term="雜"/><title type='text'>Java is always EExcellent</title><subtitle type='html'>Java, J2EE, Web Development 以及其他的程式語言分享與教學</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>204</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-7361088448806999577</id><published>2018-02-05T16:59:00.001+08:00</published><updated>2018-05-07T15:52:13.987+08:00</updated><title type='text'>ShopBack Engineering Blog</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Following is official Shopback Engineering Blog on Medium&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;a href=&quot;https://medium.com/shopback-engineering&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Shopback Engineering Blog on Medium&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Please follow it and I will publish&lt;span style=&quot;background-color: white; font-size: 16px;&quot;&gt;&amp;nbsp;some tech articles on irregular basis.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white; font-size: 16px;&quot;&gt;Thanks.&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/7361088448806999577/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2018/02/shopback-engineering-blog.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/7361088448806999577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/7361088448806999577'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2018/02/shopback-engineering-blog.html' title='ShopBack Engineering Blog'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-4006900863185351108</id><published>2015-08-10T14:55:00.001+08:00</published><updated>2015-08-26T13:39:43.680+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Spark"/><title type='text'>Certified Spark Developer</title><content type='html'>Certified Spark Developer 是一張由 Databricks 提供的 Apache Spark 開發者的認證考試&lt;br /&gt;
&lt;br /&gt;
關於 Certified Spark Developer 資料可以看&lt;a href=&quot;https://databricks.com/spark/certification/certified-spark-developer&quot;&gt;這裡&lt;/a&gt;，另外這張認證是由 Oreilly 處理考試過程，詳細的考試資訊可以看 &lt;a href=&quot;http://www.oreilly.com/data/sparkcert&quot;&gt;這裡&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
建議考前幾天要注意電腦設備和環境是否符合要求，要詳細閱讀這份&lt;a href=&quot;http://www.kryteriononline.com/docs/PreparingForYourExam.pdf&quot;&gt;文件&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
在這裡分享一下我的考前準備&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Learning Spark 要熟讀&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
我把 &lt;a href=&quot;http://shop.oreilly.com/product/0636920028512.do&quot;&gt;Learning Spark&lt;/a&gt; 從頭到尾讀了三遍，最後在考試之前再快速複習重點一次。&lt;br /&gt;
&lt;br /&gt;
不過在最後一個章節 Machine Learning with MLlib 我花較少的時間，畢竟這要有點相關知識，讀起來才比較順&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Scala 與 Python 基礎語法&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
在考前我有把 Scala 與 Python 的基本語法搞清楚，基本上迴圈操作，類別宣告與函式定義都需要了解&lt;br /&gt;
&lt;br /&gt;
另外最重要的就是&lt;span style=&quot;color: red;&quot;&gt;集合物件的操作必須要熟悉&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
我本身最熟 Java，所以花在 Scala 與 Python 比較多時間&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;程式實作&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
在準備考試之前已經有寫過一些 Spark 的程式了，考前一樣有寫一些關於 RDD 與 Spark SQL 的程式&lt;br /&gt;
&lt;br /&gt;
但我比較著重在 Learning Spark 的&lt;span style=&quot;color: red;&quot;&gt;第三章與第四章&lt;/span&gt;的程式實作，基本上每一個 RDD 的 operation 我都有寫過至少一遍&lt;br /&gt;
&lt;br /&gt;
原則上不是去背這些 RDD，是觀察這些 RDD 的結果會是什麼，例如：&lt;br /&gt;
&lt;br /&gt;
rdd1.union(rdd2) 的結果資料會不會重覆，rdd1.intersection(rdd2) 的資料是否會重覆 等等的&lt;br /&gt;
&lt;br /&gt;
比較複雜的是第四章，需要多花點時間去看這些 RDD 的結果會是怎樣。&lt;br /&gt;
&lt;br /&gt;
另外 Java 有很多的 Interface，我也花了蠻多時間去背。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
因為考試之前都沒找到過什麼考古題，在網路上也沒什麼經驗分享之類的&lt;br /&gt;
&lt;br /&gt;
所以也不知道出題方向，不過對 Spark 有點認知的話，其實也猜得出來 RDD 絕對是重點&lt;br /&gt;
&lt;br /&gt;
因此除了 RDD 熟讀之外，還是很扎實的讀完其他章節&lt;br /&gt;
&lt;br /&gt;
以下來分享我考完的心得&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;
在考試當中是非常嚴格的，原則上你是沒辦法作弊的....，也很難把考題拿出去，所以就憑本事拉！！&lt;br /&gt;
&lt;br /&gt;
這次我的考試當中大概有 6 題左右是標準不用思考的送分題&lt;br /&gt;
&lt;br /&gt;
其中這次程式題占了一半左右的篇幅，而這些程式中，以 Scala 與 Python 的語言為多數， Java 少得可憐&lt;br /&gt;
&lt;br /&gt;
而程式題基本上大多是跟 RDD 和 Spark SQL 有關，並且題目絕對不是像書上那樣簡單的&lt;br /&gt;
&lt;br /&gt;
所以當下真的花了很多時間在思考這些程式題，不過至少不致於困難到你算不出來，但就是要有耐心就是了&lt;br /&gt;
&lt;br /&gt;
因為有不少題目本身包含了很長的程式外，連四個選項都是一長串程式......&lt;span style=&quot;color: red;&quot;&gt;所以耐心與程式基礎很重要&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
基本上我認為你只要書讀得熟，RDD 與 Spark SQL 程式徹底搞懂就蠻有機會接近 Pass 了&lt;br /&gt;
&lt;br /&gt;
另外除了這些程式題之外，也考了一些蠻進階的東西與一些觀念題，&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
如果有興趣的可以問我，不方便在網路上直接說題目　：）&lt;br /&gt;
&lt;br /&gt;
下面這張照片是 隔了一個多月之後才收到的證照&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN0aRlmwBiruoUonJ2vjC5uyGiC5T7O_35iLC_ldNOIqeYdJvjP0fu5NWOGFaL5P-vJdZE5Ay15Knh4YJmuWAq10yBIHr-qBPaqMHvPq8z1RcYp9qCoyvQjRgaMVZAnupKCxPPm6scR5Q/s1600/IMAG0771%255B1%255D.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;226&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN0aRlmwBiruoUonJ2vjC5uyGiC5T7O_35iLC_ldNOIqeYdJvjP0fu5NWOGFaL5P-vJdZE5Ay15Knh4YJmuWAq10yBIHr-qBPaqMHvPq8z1RcYp9qCoyvQjRgaMVZAnupKCxPPm6scR5Q/s400/IMAG0771%255B1%255D.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/4006900863185351108/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/08/certified-spark-developer.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4006900863185351108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4006900863185351108'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/08/certified-spark-developer.html' title='Certified Spark Developer'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN0aRlmwBiruoUonJ2vjC5uyGiC5T7O_35iLC_ldNOIqeYdJvjP0fu5NWOGFaL5P-vJdZE5Ay15Knh4YJmuWAq10yBIHr-qBPaqMHvPq8z1RcYp9qCoyvQjRgaMVZAnupKCxPPm6scR5Q/s72-c/IMAG0771%255B1%255D.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-3982168634535006593</id><published>2015-05-23T13:37:00.000+08:00</published><updated>2015-05-24T13:38:12.867+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="flux"/><category scheme="http://www.blogger.com/atom/ns#" term="React.js"/><category scheme="http://www.blogger.com/atom/ns#" term="設計模式"/><title type='text'>React.js - Stateless principal in react</title><content type='html'>之前為了建立一個複雜的 react 和 flux 的大型應用，花了不少時間把很多關於 react 和 flux 的文章看過一遍&lt;br /&gt;
&lt;br /&gt;
要整合 react 和 flux，並不是用了這兩樣東西就讓你的前端應用完好無缺&lt;br /&gt;
&lt;br /&gt;
這篇先從 react 的角度來看前端元件的開發準則，之後有空再寫點我對 flux 更深入的見解&lt;br /&gt;
&lt;br /&gt;
首先為什麼要用 react 來開發前端，&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;因為前端的所有東西都是元件 (Everything is component)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
這也是 react 專注的重點，讓你能夠容易快速的建構一個前端應用&lt;br /&gt;
&lt;br /&gt;
所以當我們透過 react 開發並且把焦點關注在元件(Component)開發上時，有幾個原則是盡量要遵循的&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;Composable&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;Reusable&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;Maintainable&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;Testable&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
在 Facebook 還沒 open react.js 之前，我只認為 jQuery 是最容易做到上述四點的&lt;br /&gt;
&lt;br /&gt;
雖然後續有很多前端的框架 Backbone, Angular, Ember 等等，它們的重點多半是在 MV* 身上&lt;br /&gt;
&lt;br /&gt;
對於一個&lt;u&gt;&lt;b&gt;前端的元件開發&lt;/b&gt;&lt;/u&gt;而言，它們都並不是非常好用或是友善的。&lt;br /&gt;
&lt;br /&gt;
所以當你在用 React.js 開發前端的時候，也須謹記上述四點，才能讓你用 react 的價值發揮到最大&lt;br /&gt;
&lt;br /&gt;
而除了這四點之外，還有一點是相當重要的，就是 &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;Stateless component&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
什麼是 Stateless component ?&lt;br /&gt;
&lt;br /&gt;
簡單說就是元件盡量是無狀態的，它不需要處理&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;資料&lt;/span&gt;&lt;/b&gt;或&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;UI狀態&lt;/span&gt;&lt;/b&gt;的變化，只要接收資料並呈現就好&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
所謂的&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;資料&lt;/span&gt;&lt;/b&gt;就是領域模型(domain model)的資料，例如 Product。這些資料多半是透過 Ajax 或是 RESTful 從後端獲得的。&lt;br /&gt;
&lt;br /&gt;
至於 &lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;UI狀態&lt;/span&gt;&lt;/b&gt;，就是用來&quot;記錄&quot; UI 目前的狀態，比方說哪一個 tab 被選擇，或是哪一個 dialog 被打開 等等。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
就一個 Stateless 的設計而言，Composable 的元件是很重要的前提，一個 Composable 的結構會類似如下&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIKCvPvWjkjBxmkVMOhpwu_P0ubdAb-jR83GoswR0T3vaW9rfpztizjAICZfbDHjTiiino1AE_j3tHyyoVXGJSwpylpxFoY_QypZR1FzDpBt2UYW_52Fa5Ku1An8qfM2LX7lFwBHUBG0U/s1600/react-composable.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;257&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIKCvPvWjkjBxmkVMOhpwu_P0ubdAb-jR83GoswR0T3vaW9rfpztizjAICZfbDHjTiiino1AE_j3tHyyoVXGJSwpylpxFoY_QypZR1FzDpBt2UYW_52Fa5Ku1An8qfM2LX7lFwBHUBG0U/s320/react-composable.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
在一個良好的 Composable 設計下，我們必須要把需要呈現的資料透過 Root 傳到底下的 component&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;而底下的 component 只需負責呈現並處理使用者的 action，所以只有 Root 需要 state，底下的只需要接收 props 的資料&lt;/u&gt;&lt;br /&gt;
&lt;u&gt;&lt;br /&gt;&lt;/u&gt;
&lt;u&gt;這裡的 state 以及 props 就是 react.js 所提供的 state 以及 props&lt;/u&gt;&lt;br /&gt;
&lt;u&gt;&lt;br /&gt;&lt;/u&gt;
&lt;u&gt;我們知道 react 的 state 是 mutable (可變)的，而 prop 則是 immutable (不可變)的&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
所以在掌握這個原則下，應該&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;&lt;u&gt;盡量&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;在 Root 使用 state，Root 底下就只接收 prop 的資料並呈現&lt;br /&gt;
&lt;br /&gt;
因此我們可以檢視一下我們的 React 設計，&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;盡量避免以下的情況&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgntUGrdpA0gwgSZS7nIsK8TjpVjCJWE6vmMtSvCtnt8ji8XXQcYNQrZwbo3T2oIGvKNDh0-jrR3jrPmAbwDatsJ8hfLmAGoFhnlN7iU7QDmQpnydRLOV5_2kTdREEKbdueaQCkt9imA-Y/s1600/stateful-component.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgntUGrdpA0gwgSZS7nIsK8TjpVjCJWE6vmMtSvCtnt8ji8XXQcYNQrZwbo3T2oIGvKNDh0-jrR3jrPmAbwDatsJ8hfLmAGoFhnlN7iU7QDmQpnydRLOV5_2kTdREEKbdueaQCkt9imA-Y/s320/stateful-component.png&quot; width=&quot;307&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
也就是說盡可能避免在 Root 底下的&amp;nbsp;Components&amp;nbsp;擁有自己的 state，這會讓&amp;nbsp;Components&amp;nbsp;富有太多行為，進而更複雜&lt;br /&gt;
&lt;br /&gt;
在一個正確的 Stateless component 設計下，與 flux 組合就更容易掌握&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguINHDViFiFa2BXLezUJhWamOdnBAoxH_twrEjj5skQ5YLPcskoDjqv7IJInlr83gEMU8mIC9LmhqEETgGrVdURc0Ab3fxY5kZgM-o1PXdUhGlvxwsKDgFz-Sdora2WsehA5yJfcVVd1c/s1600/flux-stateless.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;273&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguINHDViFiFa2BXLezUJhWamOdnBAoxH_twrEjj5skQ5YLPcskoDjqv7IJInlr83gEMU8mIC9LmhqEETgGrVdURc0Ab3fxY5kZgM-o1PXdUhGlvxwsKDgFz-Sdora2WsehA5yJfcVVd1c/s320/flux-stateless.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
從上圖我們可以看到，Root 底下的&amp;nbsp;Components&amp;nbsp;只負責呈現資料，當有使用者的 action 時&lt;br /&gt;
&lt;br /&gt;
不管這些 action 是改變 &lt;span style=&quot;color: #3d85c6;&quot;&gt;&lt;b&gt;領域模型的資料&lt;/b&gt;&lt;/span&gt;或是 &lt;b&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;UI 狀態&lt;/span&gt;&lt;/b&gt;的資料，我們都將這些變動行為視為是 flux 中的 Action&lt;br /&gt;
&lt;br /&gt;
透過 Action 到 Store 之後，由 Store 來負責處理這些&lt;span style=&quot;color: #3d85c6;&quot;&gt;&lt;b&gt;模型&lt;/b&gt;&lt;/span&gt;或是&lt;span style=&quot;color: #3d85c6;&quot;&gt;&lt;b&gt;UI狀態&lt;/b&gt;&lt;/span&gt;的資料&lt;br /&gt;
&lt;br /&gt;
例如：使用者可能新增了一筆產品資料又或是他在 UI 上切換了一個 tab&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;background-color: white; color: #b45f06;&quot;&gt;&lt;u&gt;當然可能會有人質疑為什麼連 UI 狀態這些資料也要 hold 在 Store 中&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
我是認為如果太多的 Component 都不能遵循 stateless 這原則的話&lt;br /&gt;
&lt;br /&gt;
每個 Component 都會因為擁有 State 的情況下，讓該 Component 一定會有很多處理 State 的邏輯&lt;br /&gt;
&lt;br /&gt;
畢竟 State 是 mutable，既然是 mutable，你就必須付出代價去處理它，所謂的代價&lt;br /&gt;
&lt;br /&gt;
就是那些定義在 Component 內的邏輯處理，相對的它會讓你的 Component 不易維護也過於複雜&lt;br /&gt;
&lt;br /&gt;
因此我是認為像類似 哪個 tab 被選擇，或是 list 清單中哪個 item 被勾選，這類的 UI 狀態資料，是可以嘗試放到 Store 的&lt;br /&gt;
&lt;br /&gt;
盡量將他們從 Component 的 State 抽離出來，讓 Component 盡量保持簡單的呈現邏輯就好&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;當然這是盡量並非一定，所以本篇的結論就像 React 官網所說的&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;strong style=&quot;background-color: #f9f9f9; border: none; box-sizing: border-box; font-family: proxima-nova, &#39;Helvetica Neue&#39;, Helvetica, Roboto, Arial, sans-serif; line-height: 20.4799995422363px; margin: 0px; padding: 0px;&quot;&gt;&lt;span style=&quot;color: #cc0000; font-size: large;&quot;&gt;Try to keep as many of your components as possible stateless.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/3982168634535006593/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/05/reactjs-stateless-principal-in-react.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/3982168634535006593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/3982168634535006593'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/05/reactjs-stateless-principal-in-react.html' title='React.js - Stateless principal in react'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIKCvPvWjkjBxmkVMOhpwu_P0ubdAb-jR83GoswR0T3vaW9rfpztizjAICZfbDHjTiiino1AE_j3tHyyoVXGJSwpylpxFoY_QypZR1FzDpBt2UYW_52Fa5Ku1An8qfM2LX7lFwBHUBG0U/s72-c/react-composable.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-5493900323643567608</id><published>2015-05-22T15:09:00.000+08:00</published><updated>2015-05-23T15:11:55.282+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="babel"/><category scheme="http://www.blogger.com/atom/ns#" term="ECMAScript 6"/><category scheme="http://www.blogger.com/atom/ns#" term="React.js"/><title type='text'>React.js in es6</title><content type='html'>React.js 在 v0.13.0 版之後開始支援 ES6 的語法，如果想學習 ES6 語法的人可以看一下這些教學&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://es6.ruanyifeng.com/&quot;&gt;ECMAScript 6入门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://babeljs.io/docs/learn-es6/&quot;&gt;Learn ES6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
對於最新 ES6 的 React.js 寫法，一個最基本的範例就是建立一個 Component&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: large;&quot;&gt;React Component&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
以往 ES5 我們會利用類似如下的寫法來建立一個 Component&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/4c949df246690c2640f8.js?file=es5_basic.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
首先在 ES5 我們會用 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
require
&lt;/span&gt;
&lt;/span&gt; 來引入你需要的模組，再來利用 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
React.createClass
&lt;/span&gt;
&lt;/span&gt; 建立一個 Component&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
最後透過 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
module.exports
&lt;/span&gt;
&lt;/span&gt; 來 export 一個 Component&lt;br /&gt;
&lt;br /&gt;
至於要如何用 ES6 的語法建立一個 React 的 Component 呢?　如下：&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/4c949df246690c2640f8.js?file=es6-basic.js&quot;&gt;&lt;/script&gt;

我們可以看到原本的 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
require
&lt;/span&gt;
&lt;/span&gt; 換成了 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
import {} from &quot;&quot;&lt;/span&gt;
&lt;/span&gt; 而 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
module.exports
&lt;/span&gt;
&lt;/span&gt; 換成了 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
export default
&lt;/span&gt;
&lt;/span&gt; &lt;/div&gt;
&lt;br /&gt;
最重要的是，利用了 ES6 定義的 class 來達到基本的 prototype-based 的 object oriented pattern
&lt;br /&gt;
&lt;br /&gt;
所以在 ES6 語法中我們就可以把一個 React 的 Component 透過 class 的定義並繼承 React.Component 來建立一個 Component 的類別
&lt;br /&gt;
&lt;br /&gt;
當然大多數 React 所定義的方法都沒有變動，包括 render,&amp;nbsp;componentWillMount,&amp;nbsp;componentDidMount...等等&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: large;&quot;&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Prop &amp;amp; PropTypes&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;br /&gt;
接下來我們的 Component 建議最好要定義 props 的型態和預設值，React 會幫你驗證&lt;br /&gt;
&lt;br /&gt;
如果有型態錯誤，會在 console 印出警告。在 ES5 的語法中，我們是這樣寫的&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/4c949df246690c2640f8.js?file=es5-props.js&quot;&gt;&lt;/script&gt;

至於在 ES6 中，我們會這樣定義：&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/4c949df246690c2640f8.js?file=es6-props.js&quot;&gt;&lt;/script&gt;

個人是認為 ES6 的語法透過 class 的定義方式會稍為簡單明瞭 :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: large;&quot;&gt;State&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;br /&gt;
在 ES5 的寫法中，我們會定義 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
getInitialState
&lt;/span&gt;
&lt;/span&gt; 來初始化 Component 的 state 物件，如下所示：&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/4c949df246690c2640f8.js?file=es5-state.js&quot;&gt;&lt;/script&gt;

至於在 ES6 的語法中，可以在 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
constructor
&lt;/span&gt;
&lt;/span&gt; (類似Java的建構子) 中透過 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
this.state
&lt;/span&gt;
&lt;/span&gt; 直接定義 state 的物件&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: large;&quot;&gt;Instance method&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/4c949df246690c2640f8.js?file=es6-state.js&quot;&gt;&lt;/script&gt;

這裡所謂的 instance method，就是在描述 component 觸發事件 callback function 中，this 的問題，例如 click&lt;br /&gt;
&lt;br /&gt;
這在 ES5 中是沒有這樣的問題的，例如：&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/4c949df246690c2640f8.js?file=es5-instancemethod.js&quot;&gt;&lt;/script&gt;

但是在 ES6 的寫法中，我們必須在 callback function 後面加上 .bind(this)，否則 this 會是觸發事件的那個物件&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/4c949df246690c2640f8.js?file=es6-instancemethod.js&quot;&gt;&lt;/script&gt;

也可以像以下的方式也是可行的：&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/4c949df246690c2640f8.js?file=es6-improveinstancemethod.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;結論&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
其實利用 ES6 來撰寫 React，改動老實說沒有很大，但你可以多加利用 ES6 的新語法來完成一些新的 JS 特性&lt;br /&gt;
&lt;br /&gt;
並透過類別繼承的方式讓 Component 更能達到 reusable 以及 maintainable&lt;br /&gt;
&lt;br /&gt;
另外值得一提的就是 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;
&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;
mixin
&lt;/span&gt;
&lt;/span&gt; 在 ES6 的語法中並不支援，但是目前網路上有一些人貢獻一些方式可以達成&lt;br /&gt;
&lt;br /&gt;
但這都不是官方所釋放出來的解決方案，所以這點需要多加考慮&lt;br /&gt;
&lt;br /&gt;
至於要如何將 ES6 的語法轉譯成 ES5，你可以用 babel 或是&amp;nbsp;traceur 來完成&lt;br /&gt;
&lt;br /&gt;
babel 的話，之前有寫過一個簡單的範例，可以參考&amp;gt;&amp;gt;&lt;a href=&quot;http://programer-learn.blogspot.tw/2015/03/reactjs-flux-example-with-es6-and-babel.html&quot;&gt;範例&lt;/a&gt;&amp;lt;&amp;lt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/5493900323643567608/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/05/reactjs-in-es6.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/5493900323643567608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/5493900323643567608'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/05/reactjs-in-es6.html' title='React.js in es6'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-2297556585182273413</id><published>2015-04-19T20:13:00.002+08:00</published><updated>2015-04-19T20:13:39.652+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="babel"/><category scheme="http://www.blogger.com/atom/ns#" term="ECMAScript 6"/><category scheme="http://www.blogger.com/atom/ns#" term="React.js"/><title type='text'>React.js - using Jest and Babel to test ES6 code</title><content type='html'>本偏介紹一下如果你是用 ES6 的語法寫的 React.js 應用程式，如果利用 Jest 測試時要住意那些部份&lt;br /&gt;
&lt;br /&gt;
原則上測試的過程不外乎 Jest 官網介紹的&amp;nbsp;&lt;a href=&quot;https://facebook.github.io/jest/docs/tutorial-react.html&quot;&gt;&amp;gt;&amp;gt;here&amp;lt;&amp;lt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
如果你是用 ES6 語法進行開發的話，你需要注意的是利用&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;react-tools&amp;nbsp;&lt;/span&gt;作 transform 時需要指定你的 JS 語法是 ES6&lt;br /&gt;
&lt;br /&gt;
設定方式就是透過 preprocessor.js 讓&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;react-tools&lt;/span&gt;&amp;nbsp;在 transform 的時候可以將 ES6 語法 enabled 起來&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/691acb9f74e998a1a2b0.js?file=preprocessor.js&quot;&gt;&lt;/script&gt;

根據&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;react-tools&lt;/span&gt;&amp;nbsp;的官方介紹，如同上述的方式加入 harmony 並指定為 true 就可以了&lt;br /&gt;
&lt;br /&gt;
此外我再額外介紹一種方式就是利用&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;babel&lt;/span&gt;&amp;nbsp;來進行 transform 的動作&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;babel&lt;/span&gt;&amp;nbsp;本身就可以對 ES6 的語法以及 JSX 的進行轉換，所以你也不用擔心&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;babel&lt;/span&gt;&amp;nbsp;不認得 React.js&lt;br /&gt;
&lt;br /&gt;
透過 &lt;span style=&quot;background-color: black; color: white; font-family: Courier New, Courier, monospace;&quot;&gt;npm install babel --save-dev&lt;/span&gt; 安裝&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;babel&lt;/span&gt;&amp;nbsp;之後&lt;br /&gt;
&lt;br /&gt;
修改你的 preprocessor.js，如下所示：&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/691acb9f74e998a1a2b0.js?file=preprocessor1.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/2297556585182273413/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/04/reactjs-using-jest-and-babel-to-test.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/2297556585182273413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/2297556585182273413'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/04/reactjs-using-jest-and-babel-to-test.html' title='React.js - using Jest and Babel to test ES6 code'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-5999687199953796033</id><published>2015-04-12T19:31:00.003+08:00</published><updated>2015-04-27T01:10:14.658+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bootstrap"/><category scheme="http://www.blogger.com/atom/ns#" term="React.js"/><category scheme="http://www.blogger.com/atom/ns#" term="Table"/><title type='text'>React.js - Bootstrap table</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;I created a Bootstrap Table rebuilt for React.js, current version is 0.3.0.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Home page is here: &lt;a href=&quot;http://allenfang.github.io/react-bootstrap-table/index.html&quot;&gt;React-bootstrap-table&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;You can visit Github on here: &lt;a href=&quot;https://github.com/AllenFang/react-bootstrap-table&quot;&gt;react-bootstrap-table&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;The features on react-bootstrap-table&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Column align&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Basic table style:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;striped, hover,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;condensed, border..&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Scrolling&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Table sort&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Column format&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Pagination&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Row selection&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Cell Edit&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;You can reference more examples on &lt;a href=&quot;http://allenfang.github.io/react-bootstrap-table/example.html&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;In the future, I will provide more function on ReactBsTable, like &amp;nbsp;table event or some change on table.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;If you like it, give it a star on github, Thanks&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;----------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;最近用了空閒時間寫了一個基於 React.js 的 Bootstrap table 元件&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;首頁在這邊:&amp;nbsp;&lt;a href=&quot;http://allenfang.github.io/react-bootstrap-table/index.html&quot;&gt;React-bootstrap-table&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Github:&amp;nbsp;&lt;a href=&quot;https://github.com/AllenFang/react-bootstrap-table&quot;&gt;react-bootstrap-table&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;ReactBsTable 支援基本的 Bootstrap table classes&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;例如： .table-striped, .table-hover, .table-condensed ... 等&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;另外也支援了欄位的 排序(sort), 格式(format), 對齊(align), 分頁等&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;可以在這邊看到所有的範例：&amp;nbsp;&lt;a href=&quot;http://allenfang.github.io/react-bootstrap-table/example.html&quot;&gt;here&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;之後我也會繼續提供更多的功能以及事件&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;如果你喜歡的話，可以到GitHub&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/AllenFang/react-bootstrap-table&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;react-bootstrap-table&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;span style=&quot;font-size: large;&quot;&gt;給個 Star&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;我會更有動力繼續改善的，&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;感謝!!!!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/5999687199953796033/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/04/reactjs-bootstrap-table.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/5999687199953796033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/5999687199953796033'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/04/reactjs-bootstrap-table.html' title='React.js - Bootstrap table'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-1245215871030841663</id><published>2015-03-30T16:30:00.000+08:00</published><updated>2015-03-30T16:30:26.446+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="browserify"/><category scheme="http://www.blogger.com/atom/ns#" term="gulp"/><title type='text'>browserify 與 watchify 分享</title><content type='html'>本篇來分享一下在 gulp 的建構環境中如何使用 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;browserify&lt;/span&gt;&lt;/span&gt;&amp;nbsp;以及 &lt;span style=&quot;color: #c7254e; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;background-color: #f9f2f4; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;watchify&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
如果對 gulp 與&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;browserify&lt;/span&gt;&amp;nbsp;不熟的的建議要先學習一下，&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;browserify&lt;/span&gt;&amp;nbsp;之前的文章都有提到過了&lt;br /&gt;
&lt;br /&gt;
而 gulp 則是一個目前盛行於 javascript 的建構工具，相較於 Grunt 而言，實在是好用太多了 &lt;b&gt;^.^&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
至於為什麼要介紹 browserify 與&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;watchify&lt;/span&gt;，其目的在於希望能夠再開發的過程中&lt;br /&gt;
&lt;br /&gt;
如果一有程式的變動，就能夠&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;自動&lt;/span&gt;&lt;/b&gt;執行 browserify 建構的動作，基於這個因素就需要&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;watchify&lt;/span&gt;&amp;nbsp;的協助&lt;br /&gt;
&lt;br /&gt;
對 gulp 有初步了解的開發者可能也知道 gulp 本身自帶有 gulp.watch 的功能&lt;br /&gt;
&lt;br /&gt;
也是一個能夠自動監控檔案，當檔案發生變化時會自動執行開發者指定的函式，例如：&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/e85f79681e12dfa39dbe.js?file=gulpfile-basic.js&quot;&gt;&lt;/script&gt;

但 gulp.watch 的功能與&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;browserify&lt;/span&gt;&amp;nbsp;的整合比較困難，畢竟一個 javascript 的 dependency 是相當複雜的&lt;br /&gt;
&lt;br /&gt;
如果利用&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;watchify&lt;/span&gt;&amp;nbsp;好處就是它只會 rebuild (重新建構) 有需要重新建構的程式&lt;br /&gt;
&lt;br /&gt;
所以接下來就來分享一下，如何利用&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;browserify&lt;/span&gt;&amp;nbsp;與&amp;nbsp;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12.6000003814697px; line-height: 18.0000019073486px; white-space: nowrap;&quot;&gt;watchify&lt;/span&gt;&amp;nbsp;來達成這樣子的一個目標&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/e85f79681e12dfa39dbe.js?file=gulpfile.js&quot;&gt;&lt;/script&gt;
</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/1245215871030841663/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/03/browserify-watchify.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1245215871030841663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1245215871030841663'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/03/browserify-watchify.html' title='browserify 與 watchify 分享'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-1845473954504181553</id><published>2015-03-25T20:23:00.003+08:00</published><updated>2015-03-25T20:23:55.375+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="babel"/><category scheme="http://www.blogger.com/atom/ns#" term="browserify"/><category scheme="http://www.blogger.com/atom/ns#" term="ECMAScript 6"/><category scheme="http://www.blogger.com/atom/ns#" term="flux"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="React.js"/><title type='text'>React.js - a flux example with ES6 and Babel</title><content type='html'>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTDNhDOfrJbhyphenhyphenAFXloSwdjhrId7qAEj86efxDdGezw7H5tr6XyWth7rfBiYq9MUjQM3OHy4COD9cASuProLzoe9OPWtXHk1JWdgE_xyUqg7wAPICnsoU3kJnuD1XVKyCf8T0_ZQDmgVQ8/s1600/babel-logo.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTDNhDOfrJbhyphenhyphenAFXloSwdjhrId7qAEj86efxDdGezw7H5tr6XyWth7rfBiYq9MUjQM3OHy4COD9cASuProLzoe9OPWtXHk1JWdgE_xyUqg7wAPICnsoU3kJnuD1XVKyCf8T0_ZQDmgVQ8/s1600/babel-logo.png&quot; height=&quot;90&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;這篇介紹一下用最新的 ECMAScript 6 的語法並搭配 Babel 來開發一個簡單的 react/flux 的程式&lt;br /&gt;
&lt;br /&gt;
同樣這次的範例程式會放在 GitHub 上&amp;nbsp;&lt;a href=&quot;https://github.com/AllenFang/react-babel-demo&quot;&gt;&amp;gt;&amp;gt;在這裡&amp;lt;&amp;lt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
不知道 react/flux 的可以看我&lt;a href=&quot;http://programer-learn.blogspot.com/2015/03/reactjs-reactflux.html&quot;&gt;&amp;gt;&amp;gt;上一篇的教學&amp;lt;&amp;lt;&lt;/a&gt;&amp;nbsp;有寫一個簡單的 react/flux app&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjFFhlTcGf7xKMo7V0s4USIZIkatrrqGZE2ppWSJvQYXD4XNQiZr6kh8qknmrV8dnyIANEex3cf9lFa78sPIRSZ2VachP7z8KWQX5iBa1pacTuXtbxE9EcBsuIRc_P1M4dctgc63OQsEA/s1600/es6-logo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjFFhlTcGf7xKMo7V0s4USIZIkatrrqGZE2ppWSJvQYXD4XNQiZr6kh8qknmrV8dnyIANEex3cf9lFa78sPIRSZ2VachP7z8KWQX5iBa1pacTuXtbxE9EcBsuIRc_P1M4dctgc63OQsEA/s1600/es6-logo.jpg&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
對 flux 有疑問或不清楚的可以 google 找一下資料，而我之前也有寫一篇對 flux 的&lt;a href=&quot;http://programer-learn.blogspot.com/2015/03/facebookflux.html&quot;&gt;&amp;gt;&amp;gt;心得分享&amp;lt;&amp;lt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
接下來回到主題，ECMAScript 6 以下都會簡稱 ES6，在2014確定了所有的新功能與語法&lt;br /&gt;
&lt;br /&gt;
預定在今年 2015 6月左右會正式發佈，接下來瀏覽器會慢慢完全支援&amp;nbsp;ES6&amp;nbsp;的語法&lt;br /&gt;
&lt;br /&gt;
所以這篇就用 ES6 來重寫一次 react/flux 的程式&lt;br /&gt;
&lt;br /&gt;
雖然目前瀏覽器並沒有完全支援&amp;nbsp;ES6&amp;nbsp;的語法，不過我們可以透過 Babel 這個工具進行轉換&lt;br /&gt;
&lt;br /&gt;
Babel 的原名叫做 6to5，也就是一個能夠將&amp;nbsp;ES6&amp;nbsp;轉換為 ES5 的工具，所以也不用擔心瀏覽器對 es6&amp;nbsp;的相容性問題了&lt;br /&gt;
&lt;br /&gt;
至於為什麼要這麼快用&amp;nbsp;ES6&amp;nbsp;來開發程式？如果看過&amp;nbsp;ES6&amp;nbsp;的新功能之後，確實是蠻讓人期待的，之後有空再來介紹&lt;br /&gt;
&lt;br /&gt;
另外也是因為有了 Babel 這類的工具，讓目前尚未完全支援&amp;nbsp;ES6&amp;nbsp;的情況下&lt;br /&gt;
&lt;br /&gt;
可以開始專攻&amp;nbsp;ES6，等到之後&amp;nbsp;ES6&amp;nbsp;完全被瀏覽器支援後，你也不用考慮要重新寫程式了，因為你已經是在寫&amp;nbsp;ES6了&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;接下來這次的範例程式跟&amp;nbsp;&lt;a href=&quot;http://programer-learn.blogspot.com/2015/03/reactjs-reactflux.html&quot;&gt;&amp;gt;&amp;gt;React.js - react/flux 範例&amp;lt;&amp;lt;&lt;/a&gt;&amp;nbsp;的程式目的一樣，差別只是在於以下幾點&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;用 ES6 語法的新特性 Module 來取代取原本 react/flux 範例中使用的 require，而是用 import&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;用 ES6 最新的 class 特性來負責繼承，取代掉原本 react/flux 在 Store 中用的 object-assign&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;利用 Babel 對 JSX 與 React 的支援，讓你在 build (babelify) 的時候也能夠轉換 JSX 語法&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;另外也會用到一些比較零星的 ES6 語法，這裡就不再特別強調了&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
接下來就開始撰寫本次的範例，首先道專案根目錄下執行建立 package.json，內容如下&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=package.json&quot;&gt;&lt;/script&gt;

完成後執行以下指令安裝 &lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;react, flux, browserify 以及 babel(babelify)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=initial.sh&quot;&gt;&lt;/script&gt;

接下來，因為&lt;span style=&quot;color: red;&quot;&gt;程式邏輯&lt;/span&gt;都跟&lt;b style=&quot;color: red;&quot;&gt;&amp;nbsp;&lt;a href=&quot;http://programer-learn.blogspot.com/2015/03/reactjs-reactflux.html&quot;&gt;&amp;gt;&amp;gt;React.js - react/flux 範例&amp;lt;&amp;lt;&lt;/a&gt;&amp;nbsp;&lt;/b&gt;一模一樣，只是用ES6再寫一次而已&lt;br /&gt;
&lt;br /&gt;
當然建議你要對 ES6 的基本語法要有相當地認知會比較好&lt;br /&gt;
&lt;br /&gt;
所以下面我就單純列出每支程式的內容&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;src/app.js&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=app.js&quot;&gt;&lt;/script&gt;&lt;b&gt;

src/components/DemoApp.react.js&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=DemoApp.react.js&quot;&gt;&lt;/script&gt;&lt;b&gt;

src/components/Header.react.js&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=Header.react.js&quot;&gt;&lt;/script&gt;&lt;b&gt;

src/components/Content.react.js&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=Content.react.js&quot;&gt;&lt;/script&gt;

&lt;b&gt;src/actions/DemoAction.js&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=DemoAction.js&quot;&gt;&lt;/script&gt;

&lt;b&gt;src/dispatcher/DemoDispatcher.js&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=DemoDispatcher.js&quot;&gt;&lt;/script&gt;

&lt;b&gt;src/stores/DemoStore.js&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=DemoStore.js&quot;&gt;&lt;/script&gt;

&lt;b&gt;src/constants/DemoConstants.js&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=DemoConstants.js&quot;&gt;&lt;/script&gt;&lt;b&gt;

最後是 index.html&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=index.html&quot;&gt;&lt;/script&gt;

同樣的我們需要透過 browserify 進行 build 的動作才能正常執行&lt;br /&gt;
&lt;br /&gt;
所以在前面一開始的指令除了透過 npm 安裝了 browserify 之外也額外裝了 babelify&lt;br /&gt;
&lt;br /&gt;
babelify 跟上一篇講到的 reactify 同樣都是一種 browserify 的 transform&lt;br /&gt;
&lt;br /&gt;
因為沒有 babelify，就無法將 ES6 轉回 ES5，也不能轉換 JSX 語法&lt;br /&gt;
&lt;br /&gt;
所以同樣的我們要把 transform 的資訊加到 package.json&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=package1.json&quot;&gt;&lt;/script&gt;

並執行以下指令&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #cc0000; font-family: Courier New, Courier, monospace;&quot;&gt;browserify -t babelify src/*.js -o ./build/bundle.js&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
這樣就可以運行 index.html 看到結果了&lt;br /&gt;
&lt;br /&gt;
跟上次教學一樣，我也額外提供透過 gulp 的方式來 build 程式&lt;br /&gt;
&lt;br /&gt;
但要先透過 npm 安裝一些東西&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=gulpinit.sh&quot;&gt;&lt;/script&gt;

安裝完成後撰寫 gulpfile.js&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/687e4bbcb621e550fec6.js?file=Gulpfile.js&quot;&gt;&lt;/script&gt;

最後這次範例原始碼有在 &lt;a href=&quot;https://github.com/AllenFang/react-babel-demo&quot;&gt;&amp;gt;&amp;gt;GitHub&amp;lt;&amp;lt;&lt;/a&gt; 上，請自行下載。如果你覺得不錯，在 GitHub 上給個 Star 吧&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/1845473954504181553/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/03/reactjs-flux-example-with-es6-and-babel.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1845473954504181553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1845473954504181553'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/03/reactjs-flux-example-with-es6-and-babel.html' title='React.js - a flux example with ES6 and Babel'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTDNhDOfrJbhyphenhyphenAFXloSwdjhrId7qAEj86efxDdGezw7H5tr6XyWth7rfBiYq9MUjQM3OHy4COD9cASuProLzoe9OPWtXHk1JWdgE_xyUqg7wAPICnsoU3kJnuD1XVKyCf8T0_ZQDmgVQ8/s72-c/babel-logo.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-4433590626018922314</id><published>2015-03-23T22:19:00.002+08:00</published><updated>2015-03-23T22:19:42.436+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="browserify"/><category scheme="http://www.blogger.com/atom/ns#" term="flux"/><category scheme="http://www.blogger.com/atom/ns#" term="React.js"/><title type='text'>React.js - react/flux 範例 </title><content type='html'>本篇教學範例的完整原始碼在 &lt;a href=&quot;https://github.com/AllenFang/react-flux-demo&quot;&gt;&amp;gt;&amp;gt;這裡&amp;lt;&amp;lt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
如果對 Flux 的架構和細節有不清楚的，網路資源很多可以查，建議看英文比較好&lt;br /&gt;
&lt;br /&gt;
我之前有寫一篇關於 Flux 的架構分想也可以參考 &lt;a href=&quot;http://programer-learn.blogspot.tw/2015/03/facebookflux.html&quot;&gt;&amp;gt;&amp;gt;Facebook/Flux 架構分享&amp;lt;&amp;lt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
這邊在用最簡單的方式介紹一下 Flux 的架構&lt;br /&gt;
&lt;br /&gt;
原則上 Flux 是一個資料流只有單一方向的設計原則，並且把原件區分為 View, Action, Store, Dispatcher&lt;br /&gt;
&lt;br /&gt;
以下用一張簡單的圖來說明&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiieBzQ_-sVQUdr906Dh5MoAEkGP8qqpZ6sq1t6n6E_LV_BgLUVSxGBUMP1HLcigJ8-E_1L6PQ2_n-2QvFkSzx5zHXH4403kKKg3qmCqZEavdpchmjiPoZNVf6Hsg0rbJPewvlb7GX6PVA/s1600/flux.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiieBzQ_-sVQUdr906Dh5MoAEkGP8qqpZ6sq1t6n6E_LV_BgLUVSxGBUMP1HLcigJ8-E_1L6PQ2_n-2QvFkSzx5zHXH4403kKKg3qmCqZEavdpchmjiPoZNVf6Hsg0rbJPewvlb7GX6PVA/s1600/flux.png&quot; height=&quot;372&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
第一張圖是 Flux 的架構圖，我有簡化過，因為我是認為 Flux 的原圖會讓人誤會&lt;br /&gt;
&lt;br /&gt;
第二張圖是實際的運行中的資料流&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
接下來用一個很簡單的範例來實作 react 與 flux 的範例程式來介紹 flux&lt;br /&gt;
&lt;br /&gt;
首先在專案目錄(react-flux-demo)下建立 package.json，內容如下即可&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=package.json&quot;&gt;&lt;/script&gt;

接著執行以下指令&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=shell1.sh&quot;&gt;&lt;/script&gt;
上面我們透過 npm 安裝了 react, flux 以及 object-assign&lt;br /&gt;
&lt;br /&gt;
其中 object-assign 是類似用來拷貝物件的一個 node module&lt;br /&gt;
&lt;br /&gt;
接下來我們就從下面的 HTML 開始撰寫 react/flux 的程式&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=index.html&quot;&gt;&lt;/script&gt;

這次的範例很簡單，頁面上只有兩個 button ，分別代表遞增與遞減的功能，下方則會顯示目前的數值&lt;br /&gt;
&lt;br /&gt;
先從程式入口點開始 js/app.js&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=app.js&quot;&gt;&lt;/script&gt;

接下來是 js/components/DemoApp.react.js，這個是主頁面的 View&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=DemoApp.react.js&quot;&gt;&lt;/script&gt;

再來則是剩下的兩個 View：js/components/Header.react.js 以及 js/components/Content.react.js&lt;br /&gt;
&lt;br /&gt;
Header 負責呈現兩個 button 並負責 click 的事件以及與 Action 溝通&lt;br /&gt;
&lt;br /&gt;
Content 單純透過 React 的 State 來呈現目前的數值是多少&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=Header.react.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=Content.react.js&quot;&gt;&lt;/script&gt;
&lt;br /&gt;
接下來就是 Action 的部分，這是相對簡單的地方，主要就是負責提供 View 處理 user 行為的 function&lt;br /&gt;
&lt;br /&gt;
並且透過 Dispatcher 來發送這個事件出去，而只有有興趣的 Store 會聆聽這些事件&lt;br /&gt;
&lt;br /&gt;
所以先來看一下 js/actions/DemoAction.js&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=DemoAction.js&quot;&gt;&lt;/script&gt;

再來是 Dispatcher，dispatcher 在 flux 的架構中被定義為一個 singleton 的元件，只負責做事件的派送&lt;br /&gt;
&lt;br /&gt;
由於大部分 dispatcher 的處理邏輯 flux 已經 cover 掉了，所以你的 dispatcher 會相當精簡&lt;br /&gt;
&lt;br /&gt;
以下是&amp;nbsp;js/dispatcher/DemoDispatcher.js 的程式&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=DemoDispatcher.js&quot;&gt;&lt;/script&gt;

最後就是最複雜的部分了：js/stores/DemoStore.js (我把一些解釋寫在註解內了)&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=DemoStore.js&quot;&gt;&lt;/script&gt;

完成之後，我們就要利用 Browserify 來做簡單的 build 動作&lt;br /&gt;
&lt;br /&gt;
為什麼要用 Browserify？其實在前面的所有範例程式中，前面幾行都是用 require 這個函式來引入其他的 JS 檔&lt;br /&gt;
&lt;br /&gt;
或是引入 react 以及 flux 等等， require 這個函式不是憑空出現的&lt;br /&gt;
&lt;br /&gt;
畢竟我們又沒有額外引入 RequireJS 或 CommonJS 之類的，這是因為有 Browserify 的幫忙&lt;br /&gt;
&lt;br /&gt;
有空可以看看 &lt;a href=&quot;http://browserify.org/&quot;&gt;&amp;gt;&amp;gt;Browserify&amp;lt;&amp;lt;&lt;/a&gt;&amp;nbsp;，以下是他最簡短也最明瞭的解釋&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;b&gt;Browserify lets you require(&#39;modules&#39;) in the browser by bundling up all of your dependencies.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
簡單說你要透過 Browserify 來 build 你目前的所有程式，否則瀏覽器會看不懂 require ~&lt;br /&gt;
&lt;br /&gt;
另外你還需要 Reactify，這是一個 Browserify 的 transform&lt;br /&gt;
&lt;br /&gt;
能夠讓 build 的過程中也能夠轉換 react 的 JSX 語法，否則你會 build 不成功的&lt;br /&gt;
&lt;br /&gt;
所以要透過以下指令來安裝 Browserify 以及 Reactify&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=install.sh&quot;&gt;&lt;/script&gt;

並且修改 package.json，加入Browserify 的 transform&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=package1.json&quot;&gt;&lt;/script&gt;

最後就可以執行以下的指令來進行 building 的動作&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: red; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;browserify -t reactify js/*.js -o ./build/bundle.js&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
這個指令的結果會在專案目錄下的 build 目錄內產生一個 bundle.js&lt;br /&gt;
&lt;br /&gt;
最後一步我們就可以將這個 bundle.js 加到原先的 index.html 內了&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/5826b20b443c8b78ecd7.js?file=index1.html&quot;&gt;&lt;/script&gt;

==================================================&lt;br /&gt;
&lt;br /&gt;
最後補充，如果想用 gulp 執行 build 的動作的話&lt;br /&gt;
&lt;br /&gt;
可以參考 github 上的 Gulpfile.js 以及 package.json 的配置&lt;br /&gt;
&lt;br /&gt;
再次附上此次範例的連結 &lt;a href=&quot;https://github.com/AllenFang/react-flux-demo&quot;&gt;&amp;gt;&amp;gt;點我&amp;lt;&amp;lt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/4433590626018922314/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/03/reactjs-reactflux.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4433590626018922314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4433590626018922314'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/03/reactjs-reactflux.html' title='React.js - react/flux 範例 '/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiieBzQ_-sVQUdr906Dh5MoAEkGP8qqpZ6sq1t6n6E_LV_BgLUVSxGBUMP1HLcigJ8-E_1L6PQ2_n-2QvFkSzx5zHXH4403kKKg3qmCqZEavdpchmjiPoZNVf6Hsg0rbJPewvlb7GX6PVA/s72-c/flux.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-3874941771451897748</id><published>2015-03-22T19:54:00.000+08:00</published><updated>2015-03-23T19:54:35.161+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="flux"/><category scheme="http://www.blogger.com/atom/ns#" term="React.js"/><title type='text'>Facebook/Flux 架構分享</title><content type='html'>現在 react/flux 在網路上的分享或教學已經很多了，有興趣的可以上網找一些相關的資訊&lt;br /&gt;
&lt;br /&gt;
react 與 flux 的搭配算是目前正興起的一像前端開發手法&lt;br /&gt;
&lt;br /&gt;
flux 是 Facebook 提供的一套前端設計模式，也可以說是一個架構&lt;br /&gt;
&lt;br /&gt;
react 就不多說了，之前有文章介紹過了，去年看到 flux 的架構設計之後&lt;br /&gt;
&lt;br /&gt;
特別有看到 Facebook 的介紹有提到，他們認為 flux 的架構設計是比較適合大型的前端應用的&lt;br /&gt;
&lt;br /&gt;
另外也有提到前端 MVC 架構中的一些缺點，我是有部分認同他們給出來的一張圖&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXPk6ogwtl-70y0Y40E6iLXB3vwZyuALUVB-n2OEjWK7ZgsBgucbwSpLDKAMszx-38jaF2nZ7v5XsIjIiDM5MgjKyHDqg7BC__fq5dnaAlalJpX3ufaYuUobTufMlgN8GoOOgxVSTxEMc/s1600/flux-react-mvc.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXPk6ogwtl-70y0Y40E6iLXB3vwZyuALUVB-n2OEjWK7ZgsBgucbwSpLDKAMszx-38jaF2nZ7v5XsIjIiDM5MgjKyHDqg7BC__fq5dnaAlalJpX3ufaYuUobTufMlgN8GoOOgxVSTxEMc/s1600/flux-react-mvc.png&quot; height=&quot;181&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
上面這個例子或許是大多數大型前端應用會遇到的難題，&lt;b&gt;這已經跟 MVC 用不用得好沒關係了&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
在這之前曾經寫過大型的 backbone 程式，寫到最後(Model &amp;amp; View)就真的跟上面有點&lt;span style=&quot;background-color: white; color: #444444; font-family: arial; font-size: 16px; letter-spacing: 0.600000023841858px; line-height: 19.2000007629395px;&quot;&gt;╰(〒皿〒)╯&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
雖然後續我認為 backbone 不能很根本地稱做 MVC，至少要額外加入&amp;nbsp;marionette 與&amp;nbsp;stickit&lt;br /&gt;
&lt;br /&gt;
透過 marionette 補足 Controller， 並利用 stickit 來實現 Model 與 View 之間的 two-way binding&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
最後就是利用 backbone + marionette + stickit 實作出以 MVP 模式為主的架構&lt;br /&gt;
&lt;br /&gt;
但無論如何 Model 與 View 之間總是存在著複雜的依賴關係或是事件傳遞&lt;br /&gt;
&lt;br /&gt;
儘管前端用 RequireJS 和 Backbone 本身的 Event 機制，總是無助於那 Model 與 View 間錯綜複雜的關係&lt;br /&gt;
&lt;br /&gt;
而從 flux 的架構來看，&lt;b&gt;卻實會好一些嗎？&lt;/b&gt;我們可以先看 flux 的架構：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6s8BBL76aVIJTrlYfQKw1eiQNAlwtMqmDex_3fLOD5sWg62KVkdpe1HIysX-zSVlP937KfzJp6yDd9XguB4iazHkDEfy5oQwfyuNksR-GpCsp16eI4rqmyCrB35SAyHtYcwnISg0f_tI/s1600/flux-react.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6s8BBL76aVIJTrlYfQKw1eiQNAlwtMqmDex_3fLOD5sWg62KVkdpe1HIysX-zSVlP937KfzJp6yDd9XguB4iazHkDEfy5oQwfyuNksR-GpCsp16eI4rqmyCrB35SAyHtYcwnISg0f_tI/s1600/flux-react.png&quot; height=&quot;179&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
flux 的重點在於他架構中的資料流只有單向的，並不像前面那張圖中 Modal 與 View 存在複雜的雙向關係&lt;br /&gt;
&lt;br /&gt;
在 flux 剛推出的時候，一開始質疑的聲音其實蠻多的，先撇開這些質疑的部分不談&lt;br /&gt;
&lt;br /&gt;
底下我用比較簡單的方式來描述 flux，因為我覺得 flux 的原圖會讓人有&quot;誤會&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYquGDdhKtgvtbzGpHiPULNmwvA0dX4UpshZ-dhLJS3DYTVCUxnuYceoFbaZ3ErKO0cw5FHzfgYyffTo18F0gj4Ya7SfplY9EDcsRM5PDzll1UfuGou2_xdKR81eisgBPt6Qhdah4Kxdk/s1600/flux.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYquGDdhKtgvtbzGpHiPULNmwvA0dX4UpshZ-dhLJS3DYTVCUxnuYceoFbaZ3ErKO0cw5FHzfgYyffTo18F0gj4Ya7SfplY9EDcsRM5PDzll1UfuGou2_xdKR81eisgBPt6Qhdah4Kxdk/s1600/flux.png&quot; height=&quot;298&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
上面第一張圖主要是描述 flux 的架構設計層面，簡單說 View 接收到一個使用者行為後&lt;br /&gt;
&lt;br /&gt;
透過一般函式呼叫的方式呼叫 Action，而 Action 則會透過 &lt;span style=&quot;color: red;&quot;&gt;Dispatcher&lt;/span&gt; 觸發一個事件&lt;br /&gt;
&lt;br /&gt;
Store 要扮演的腳色就是聆聽想要的事件並處理相關的業務邏輯或資料處理，完成後觸發資料變化的事件&lt;br /&gt;
&lt;br /&gt;
最後就是 View 只需要聆聽資料變化的事件並進行畫面的更新&lt;br /&gt;
&lt;br /&gt;
上面第二張圖則是實際資料流，這我就不多說了，應該很清楚才對&lt;br /&gt;
&lt;br /&gt;
說到這邊，&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;我是認為 flux 其實跟 MVC 或 MVP 蠻像的，至少個75 ~ 80%吧....&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
所以對於本篇文章的第一張圖，我是覺得 flux 原則上只是將 Modal 與 View 之間的關聯簡化到只有單一方向的資料流&lt;br /&gt;
&lt;br /&gt;
但這就是 flux 的最大的差異點，&lt;b&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;它的資料流永遠只有單一方向的&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
因此另一個特點就是 &lt;b&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;Store 是內聚的，沒有任何元件可以更改 Store 內的資料&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
也就是說 &lt;b&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;Store 與 View 和 Action 間彼此是不互相影響的，因此會降低資料與模型間的複雜度&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
另外 Dispatcher 在 flux 的設計中就是一個&amp;nbsp;singleton 的元件，只負責 Action 與 Store 間的事件派送&lt;br /&gt;
&lt;br /&gt;
這個設計我覺得是沒什麼問題的，當然如果沒有 Dispatcher ，讓 Action 與 Store 直接做事件的傳送也是可以&lt;br /&gt;
&lt;br /&gt;
但要設計得當，否則會讓 Action 與 Store 有太多的耦合關係&lt;br /&gt;
&lt;br /&gt;
目前來說 flux 與 react 的搭配是值得學習的，與 AngularJS 相比&lt;br /&gt;
&lt;br /&gt;
react/flux 的架構相對來說比較透明且簡單理解，怎麼說?&lt;br /&gt;
&lt;br /&gt;
因為 flux 的流程是單向的，你會更好更容易的掌握資料的變化，在大型應用中&lt;br /&gt;
&lt;br /&gt;
對於程式的位置或是在 debug 上，相對於 AngularJS 來說更為容易，但這並不表示 AngularJS 不好&lt;br /&gt;
&lt;br /&gt;
而是 AngularJS 在大型應用的開發中會很複雜，在 debug，trace code 與設計方面要花很大的心思&lt;br /&gt;
&lt;br /&gt;
畢竟要把 AngularJS 學好並不是件容易的事情，當然我們也可以期待 AngularJS 2.0 的表現了</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/3874941771451897748/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/03/facebookflux.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/3874941771451897748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/3874941771451897748'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/03/facebookflux.html' title='Facebook/Flux 架構分享'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXPk6ogwtl-70y0Y40E6iLXB3vwZyuALUVB-n2OEjWK7ZgsBgucbwSpLDKAMszx-38jaF2nZ7v5XsIjIiDM5MgjKyHDqg7BC__fq5dnaAlalJpX3ufaYuUobTufMlgN8GoOOgxVSTxEMc/s72-c/flux-react-mvc.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-1062806559995657438</id><published>2015-03-16T20:25:00.002+08:00</published><updated>2015-03-16T20:25:29.578+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><title type='text'>AngularJS 分享 - Bootstrap Grid system directive</title><content type='html'>這篇同樣分享一下之前實作的一個 AngularJS directive，這個 directive 是用來呈現一個 Bootstrap 的 Grid system&lt;br /&gt;
&lt;br /&gt;
不知道什麼是 Bootstrap 的 Grid system 可以&lt;b&gt; &lt;a href=&quot;http://getbootstrap.com/css/#grid&quot;&gt;&amp;gt;&amp;gt;看這邊&amp;lt;&amp;lt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
比較複雜的是 要如何用 AngularJS 現有的 directive 來組成一個可變動的 Grid&lt;br /&gt;
&lt;br /&gt;
因為我不想直接用程式刻，所以都是通過 template 以及像是 ng-if，ng-init 以及 ng-repeat 這些 directive 來達成&lt;br /&gt;
&lt;br /&gt;
當然實作的方式有好有壞啦，用程式刻我認為會稍微地好理解&lt;br /&gt;
&lt;br /&gt;
但是你如果能充分利用原有的 direcitve 搭配 template 或許會讓你對 AngularJS directive 的開發更容易掌握&lt;br /&gt;
&lt;br /&gt;
下圖是這次範例實作出來的結果&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;(將所有的 products 以 grid system 呈現，每列三欄)&lt;/span&gt;&lt;/b&gt;：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq1oYNrG9Ai-1HCVVgJS0pQ8Z2u6_rPjJLUMYh6q2vr-sajwRWs8_WeyrHEuoFpiu9xZms66RAKsRuJkiIrKSdfVu3t4LpRXV7D9cLvDG5eL6W6q6EAnSiXtUII0aDekRf3-lJkNsmSUo/s1600/bootstrap-grid-system.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq1oYNrG9Ai-1HCVVgJS0pQ8Z2u6_rPjJLUMYh6q2vr-sajwRWs8_WeyrHEuoFpiu9xZms66RAKsRuJkiIrKSdfVu3t4LpRXV7D9cLvDG5eL6W6q6EAnSiXtUII0aDekRf3-lJkNsmSUo/s1600/bootstrap-grid-system.png&quot; height=&quot;230&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
首先把我把 directive 分成 productContainer (表示整個 Grid system 的 directive)&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
以及 productRow (表示 Grid system 中的每一列的 directive)&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/8688cec40fa822830661.js?file=directive.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
接下來就是這兩個 directive 對應的 template 程式，最複雜的就是&amp;nbsp;productsTemplate.html 了&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/8688cec40fa822830661.js?file=productsTemplate.html&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/8688cec40fa822830661.js?file=productRowTemplate.html&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
最後就是這個 directive 使用的部分&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/8688cec40fa822830661.js?file=index.html&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/1062806559995657438/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/03/angularjs-bootstrap-grid-system.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1062806559995657438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1062806559995657438'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/03/angularjs-bootstrap-grid-system.html' title='AngularJS 分享 - Bootstrap Grid system directive'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq1oYNrG9Ai-1HCVVgJS0pQ8Z2u6_rPjJLUMYh6q2vr-sajwRWs8_WeyrHEuoFpiu9xZms66RAKsRuJkiIrKSdfVu3t4LpRXV7D9cLvDG5eL6W6q6EAnSiXtUII0aDekRf3-lJkNsmSUo/s72-c/bootstrap-grid-system.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-275294722569758861</id><published>2015-03-15T14:11:00.001+08:00</published><updated>2015-03-15T14:11:21.254+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Heroku"/><category scheme="http://www.blogger.com/atom/ns#" term="Shippable"/><title type='text'>GitHub + Shippable + Heroku : A continuous development way</title><content type='html'>本篇介紹該如何將你在 GitHub 上的專案透過 &lt;a href=&quot;https://www.shippable.com/&quot;&gt;Shippable&lt;/a&gt; 和 &lt;a href=&quot;https://www.heroku.com/&quot;&gt;Heroku&lt;/a&gt; 做有效的結合達成 continuous development&lt;br /&gt;
&lt;br /&gt;
Continuous development 包含了很多的面向，譬如說比較常聽到的 Continuous delivery 或 Continuous deployment 等等。&lt;br /&gt;
&lt;br /&gt;
而等等要介紹的 Shippable 和 Heroku 的運用確實可以達成上述的這些 term&lt;br /&gt;
&lt;br /&gt;
Shippable 是一個強大的平台讓開發者能夠快速的做專案的整合(integrate)與建構(build)&lt;br /&gt;
&lt;br /&gt;
它能夠自動同步你 GitHub 或是 Bitbucket 內的專案來進行建構，方便的是&lt;br /&gt;
&lt;br /&gt;
假如你今天有一個專案在 GitHub 上，並且你也同步到了 Shippable&lt;br /&gt;
&lt;br /&gt;
之後你如果有任何的程式提交 (commit) 到 GitHub 上，Shippable 都會自動的進行建構的動作&lt;br /&gt;
&lt;br /&gt;
讓開發者能夠達到持續地提交，建構與測試。當然這個過程是開發者需要提供一些設定檔才能達成的&lt;br /&gt;
&lt;br /&gt;
而 Shippable 更提供了幾個主流開發語言的環境，包括 Node.js, Java, Ruby, Scala, Python 等等&lt;br /&gt;
&lt;br /&gt;
而 Heroku 則是一個 PaaS，它提供了很多種語言的 deploy (部署)與運行環境&lt;br /&gt;
&lt;br /&gt;
簡單來說就是它能夠讓你部屬你的專案到 Heroku 的 Cloud 上，並透過它給你的 domain 進行結果的瀏覽&lt;br /&gt;
&lt;br /&gt;
在進行接下來的教學前你需要有&amp;nbsp;GitHub&amp;nbsp;的帳號，並且在&amp;nbsp;GitHub&amp;nbsp;上有一些專案可以運用&lt;br /&gt;
&lt;br /&gt;
所以 GitHub 的操作就不多說了，直接從 Shippable 開始&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;建立 Shippable 與 GitHub 間的連結&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
先進入到 Shippable 的首頁&amp;nbsp;https://www.shippable.com/ 並按下中間 GitHub 的按鈕&lt;br /&gt;
&lt;br /&gt;
接下來會進行一些 GitHub 的權限認證，做完之後就會看到 Shippable 的 dashboard&lt;br /&gt;
&lt;br /&gt;
中間是你目前開啟 Shippable 與 GitHub 同步的專案，右邊會是你 GitHub 上的所有專案&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAhLZe-6f0J5Hs7iuqAWgDRAZmlZEOgCmT45KblaskaZ_mS5On-y2T7sybRTKk4wW8k5Sm-k2uc27GXwTZ9WEX4wyhm2rr4ItnwmHwhhF6wMsHq3jRVLV0MZSatDkyW3I0LeLtTXBE5zg/s1600/shippable1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAhLZe-6f0J5Hs7iuqAWgDRAZmlZEOgCmT45KblaskaZ_mS5On-y2T7sybRTKk4wW8k5Sm-k2uc27GXwTZ9WEX4wyhm2rr4ItnwmHwhhF6wMsHq3jRVLV0MZSatDkyW3I0LeLtTXBE5zg/s1600/shippable1.png&quot; height=&quot;280&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;建立 Heroku 帳號與應用(Application)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
接下來建立 Heroku 的帳號就不多說了，很簡單，就直接從建立帳號後開始說起&lt;br /&gt;
&lt;br /&gt;
帳號建立完成後你應該會看到類似下方的圖&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7vgAjYwtcArZvcZnamyq3FhLtVxoXsHzHJKqBb9Tbg4rcfw_prJ-H5m8Qm5I0guVYzH-Z43HZTzlH80cmGqLQ-H4XXcOfONCl9vQYRJrv3qlkytzHD3Pewlj6nFHopCOsmCPXLboj2xY/s1600/heroku1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7vgAjYwtcArZvcZnamyq3FhLtVxoXsHzHJKqBb9Tbg4rcfw_prJ-H5m8Qm5I0guVYzH-Z43HZTzlH80cmGqLQ-H4XXcOfONCl9vQYRJrv3qlkytzHD3Pewlj6nFHopCOsmCPXLboj2xY/s1600/heroku1.png&quot; height=&quot;148&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接下來你可以透過按下右上方角落的&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;＋&lt;/span&gt;&lt;/b&gt;來建立一個App，建立過程很簡單，你只要輸入名稱就好&lt;br /&gt;
&lt;br /&gt;
你甚至不輸入也沒關係，它會自動幫你建立一個名子。&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;設定 SSH key&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
回到剛剛的 Shippable dashboard，並按下左邊欄的 Organizations 之後，再選擇 Deployment Key，如下圖&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOaYxdJbqJsz_Wwj-NHrh6cDr8jQwSPwREa7zIoiFwjadacPMypTy61yiBpOiMLU_WuCsiO7z8zMeBCkmfpnoCa1YL7mQUzkUPmpPGLVZIaA5nPQbfZMwYnMZPH_sXqStV6U1QBmiRgtw/s1600/shippable2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOaYxdJbqJsz_Wwj-NHrh6cDr8jQwSPwREa7zIoiFwjadacPMypTy61yiBpOiMLU_WuCsiO7z8zMeBCkmfpnoCa1YL7mQUzkUPmpPGLVZIaA5nPQbfZMwYnMZPH_sXqStV6U1QBmiRgtw/s1600/shippable2.png&quot; height=&quot;185&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
並且複製 ssh-rsa key，並回去 Heroku 的 dashboard，按下左邊欄的 Account，並選擇 Manage Account，之後往下拉找到 SSH Keys 那區塊，按下右邊的 Edit，並輸入剛剛複製的 ssh key 再儲存即可，如下圖：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpdpSqVaw_VsKAp-S_yMaIC6zu5j-INiwN5lRofHIuiYxlhQ3VatfW84ggHGo1sLem_12VVFJ82Yu_pF3knmtkJ2GsbTCT1ISfhpvSSYyqQakRfLOCcI_VUNKQ3NCFLafueTatyJbQfj8/s1600/heroku2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpdpSqVaw_VsKAp-S_yMaIC6zu5j-INiwN5lRofHIuiYxlhQ3VatfW84ggHGo1sLem_12VVFJ82Yu_pF3knmtkJ2GsbTCT1ISfhpvSSYyqQakRfLOCcI_VUNKQ3NCFLafueTatyJbQfj8/s1600/heroku2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0QKNzHpNfcQgjzUKrMU6C_tsMtHxYG8jF1WS84hB0P9RRT8z6tKTfztdwPuN8nWNeHBz9NVhwr6-jRBS9WeN_YPrkQzQa3lerVn0ipQn3Ep3w7OejSu0tH8NLntZURZqbDEMgMh-hrAQ/s1600/heroku3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0QKNzHpNfcQgjzUKrMU6C_tsMtHxYG8jF1WS84hB0P9RRT8z6tKTfztdwPuN8nWNeHBz9NVhwr6-jRBS9WeN_YPrkQzQa3lerVn0ipQn3Ep3w7OejSu0tH8NLntZURZqbDEMgMh-hrAQ/s1600/heroku3.png&quot; height=&quot;99&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;建立 .shippable.yml&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
這裡我以 Node.js 為例，以下是一個非常簡單的設定檔(在專案的 root 目錄下建立)：&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/c69ed70bceb521ca2c65.js?file=.shippable.yml&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
shippable 提供很多不同階段的入口點，讓開發者可以在不同的階段做想做的事情&lt;br /&gt;
&lt;br /&gt;
例如上述範例在 npm install(before_install) 之前，會先安裝 Bower，並 install 所有的 bower dependency&lt;br /&gt;
&lt;br /&gt;
最後在成功之後 (after_success) 我們做了一個最重要的步驟，&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;就是將結果透過 git 提交到 Heroku&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
至於你的 Heroku 的 git 路徑你可以回到 Heroku 的 dashboard，並在中間下方部分選擇你剛剛建立的 Application&lt;br /&gt;
&lt;br /&gt;
再選擇之後會顯示你目前 Application 的一些資訊和狀態，接著在上方選擇 Settings 的 tab&lt;br /&gt;
&lt;br /&gt;
你就會在 Info 的區塊中找到你這麼 Application 在 Heroku 的 git url 了，如下圖：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjroAaNx9pLsOO59VwWzMdoxVjraNSYNsj5AAxQabZok92g2t9wTf7WNPWS8v4thHpson3MkpLYrGoXRqZ9267jzK_fTXhQ8t9m3xyBwhNyLrH9NQHkfzmesbC0o7WOrXvTr2ZakU3SNto/s1600/heroku4.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjroAaNx9pLsOO59VwWzMdoxVjraNSYNsj5AAxQabZok92g2t9wTf7WNPWS8v4thHpson3MkpLYrGoXRqZ9267jzK_fTXhQ8t9m3xyBwhNyLrH9NQHkfzmesbC0o7WOrXvTr2ZakU3SNto/s1600/heroku4.png&quot; height=&quot;237&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
所以你只要把 git push 後面的 git url 換成自己的就可以了&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;建立 Procfile&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
建立 Procfile (在專案的 root 下建立)，它能夠指定你的 Application 要如何在 Heroku 的平台中運行(我的範例是一個 web 的 Node.js 專案)&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/c69ed70bceb521ca2c65.js?file=Procfile&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Building Project&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
最後回到 Shippable ，在右邊欄選擇你要同步的專案,按下 Enable就可以了&lt;br /&gt;
&lt;br /&gt;
如同剛剛前面說的，只要有任何 commit 到 github 上，都會觸發一個 Shippable 任務去執行 build 的動作&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;build 成功之後，你的 dashboard 會類似下圖&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHcLhrtwEUMJGZl66b21cmhmbTvUfeBzWAMaBteX-KtlU0GF-yJK7Hyz-2N6dcBb16hzVKkYE4nr89DTH93bc-Hnsminl4Kr0OUPKcq9gUPnA2pgbx6gtOXjcCU9Qecdmo_XtTmXpaRs/s1600/shippable3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHcLhrtwEUMJGZl66b21cmhmbTvUfeBzWAMaBteX-KtlU0GF-yJK7Hyz-2N6dcBb16hzVKkYE4nr89DTH93bc-Hnsminl4Kr0OUPKcq9gUPnA2pgbx6gtOXjcCU9Qecdmo_XtTmXpaRs/s1600/shippable3.png&quot; height=&quot;41&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
你可以點進去看這個專案 building 後的 log&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgteoYjAoJxOjvzy2E2zblahx13qyUXf4AzbfCtxzy2s4JP7Z8S9ScppR2WlZpL2gPvZW1qYYtwz6_KZD0JRUsWH2eFjRu7dtD2AthXchw92SHZ2NXbkBfwoc9-c2b0diZEIExYPTpIcW4/s1600/shippable4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgteoYjAoJxOjvzy2E2zblahx13qyUXf4AzbfCtxzy2s4JP7Z8S9ScppR2WlZpL2gPvZW1qYYtwz6_KZD0JRUsWH2eFjRu7dtD2AthXchw92SHZ2NXbkBfwoc9-c2b0diZEIExYPTpIcW4/s1600/shippable4.png&quot; height=&quot;347&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
當你 build 成功之後，你可以回到 Heroku，同樣進到你的 Application 頁面並選擇 Activity &amp;nbsp;tab&lt;br /&gt;
&lt;br /&gt;
你會看到一些 build 和 deploy 的記錄&lt;br /&gt;
&lt;br /&gt;
最後就可以透過&amp;nbsp;http://&amp;lt;your application name&amp;gt;.herokuapp.com/ 這個網址查看 deploy 後的結果了&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;結語&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
基本上 GitHub 就負責對你的專案做版本的控管，這是做一個應用程式的基礎，在這基礎上&lt;br /&gt;
&lt;br /&gt;
我們透過了 Shippable 提供的功能來讓你做到應用程式的持續建構與測試，並且也能匯整出一份報告&lt;br /&gt;
&lt;br /&gt;
在成功的完成這些基本的作業後，就可以將我們的應用程式自動且直接地透過 Heroku 上到 Production 了</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/275294722569758861/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/03/github-shippable-heroku-continuous.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/275294722569758861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/275294722569758861'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/03/github-shippable-heroku-continuous.html' title='GitHub + Shippable + Heroku : A continuous development way'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAhLZe-6f0J5Hs7iuqAWgDRAZmlZEOgCmT45KblaskaZ_mS5On-y2T7sybRTKk4wW8k5Sm-k2uc27GXwTZ9WEX4wyhm2rr4ItnwmHwhhF6wMsHq3jRVLV0MZSatDkyW3I0LeLtTXBE5zg/s72-c/shippable1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-7812595404528385288</id><published>2015-03-11T23:30:00.003+08:00</published><updated>2015-03-11T23:30:33.610+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><title type='text'>AngularJS 分享 - Pagnation Directive (分頁)</title><content type='html'>前陣子無聊就來練習一下 AngularJS 的 Directive (現在我還是覺得 AngularJS 的 Directive 和它的測試是真的有那麼一點複雜...)&lt;br /&gt;
&lt;br /&gt;
之後稍微搞懂 Directive 之後就馬上順手寫了一個 AngularJS 的分頁元件&lt;br /&gt;
&lt;br /&gt;
這個分頁 Directive 的樣式是基於 Bootstrap 3 的，程式內容不會介紹太多，純粹分享原始程式&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe2uUpjMTVAE99bgkGMivooMmXGcG9O62mUv5VHkA7eezU5ioKH1f-dxpuf2jn5hh5R77FDYuepPgnspN2CUShA0rKvhGGmzN8FVAWGXfO6iTUVIfJMPQ9dtVWZGSy6BNFqc9shktRPv0/s1600/pagnation.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe2uUpjMTVAE99bgkGMivooMmXGcG9O62mUv5VHkA7eezU5ioKH1f-dxpuf2jn5hh5R77FDYuepPgnspN2CUShA0rKvhGGmzN8FVAWGXfO6iTUVIfJMPQ9dtVWZGSy6BNFqc9shktRPv0/s1600/pagnation.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/eb56a4d6918c6773c7ed.js?file=demo.html&quot;&gt;&lt;/script&gt;
&lt;/span&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/eb56a4d6918c6773c7ed.js?file=app.js&quot;&gt;&lt;/script&gt;
&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/eb56a4d6918c6773c7ed.js?file=directive.js&quot;&gt;&lt;/script&gt;
&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/eb56a4d6918c6773c7ed.js?file=paginationTemplate.html&quot;&gt;&lt;/script&gt;
&lt;/span&gt;
最後附上demo 連結 &lt;a href=&quot;http://frozen-tundra-7264.herokuapp.com/examples/L4/&quot;&gt;點我&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/7812595404528385288/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/03/angularjs-pagnation-directive.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/7812595404528385288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/7812595404528385288'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/03/angularjs-pagnation-directive.html' title='AngularJS 分享 - Pagnation Directive (分頁)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe2uUpjMTVAE99bgkGMivooMmXGcG9O62mUv5VHkA7eezU5ioKH1f-dxpuf2jn5hh5R77FDYuepPgnspN2CUShA0rKvhGGmzN8FVAWGXfO6iTUVIfJMPQ9dtVWZGSy6BNFqc9shktRPv0/s72-c/pagnation.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-5695112357830284063</id><published>2015-03-08T13:36:00.001+08:00</published><updated>2015-03-08T13:36:18.341+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="browserify"/><category scheme="http://www.blogger.com/atom/ns#" term="debowerify"/><category scheme="http://www.blogger.com/atom/ns#" term="React.js"/><title type='text'>React.js - an example with browserify and debowerify</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;前陣子在看 Facebook 的 react/flux 的架構中有注意到一點就是 browserify&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;browserify&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;的官網有講到它是一個能夠將 node module 的程式載入到前端的 JS 中&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;只要簡單的透過 require 函式即可，很像以前很常在用的 RequireJS&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;而恰好 flux 是被 Facebook 註冊為一個 npm 內的 node module&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;所以在 flux 的 TODO 範例中，他們就是用&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;browserify&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;來將 flux 的程式載入到前端&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;也順便地將 react 透過&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;browserify&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;載入，言下之意就是表示&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;react 和 flux 這兩個都是透過 npm install 進去的，可以透過 Github 上的 &lt;a href=&quot;https://github.com/facebook/flux/blob/master/examples/flux-todomvc/package.json&quot;&gt;package.json&lt;/a&gt; 得知，如下&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/da2a2d1fc4f397e47047.js?file=package.json&quot;&gt;&lt;/script&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;這樣我們在前端的 javascript 中就可以利用下面的方式引入 flux 或 react&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/da2a2d1fc4f397e47047.js?file=ex1.js&quot;&gt;&lt;/script&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;但如果你習慣將前端的套件透過 Bower 來管理而不是 npm 的話&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;那麼在 Facebook 的 react/flux 架構中要怎達成呢? 這個問題馬上就浮現在我腦中...&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;也就是說今天我剛好都是用 Bower 來管理前端 react, bootstrap ... 等等&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;那要怎麼透過&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;browserify&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;來達成相同的目的呢?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;找了一下剛好發現&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;在 Github 上有人寫了一個叫 &lt;/span&gt;&lt;a href=&quot;https://github.com/eugeneware/debowerify&quot; style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;debowerify&lt;/a&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; 的&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;browserify&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;transform&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;簡單說 debowerify 能夠輕易地將任何的 Bower 的元件透過&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;browserify&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;載入到前端中&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;所以這篇就簡單的來介紹一下如何撰寫一個簡單的 React 程式並搭配&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;browserify&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;以及 debowerify&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;再開始之前可以先看一下我之前寫的&amp;nbsp;&lt;a href=&quot;http://programer-learn.blogspot.tw/2015/02/reactjs-helloworld-example-with-express.html&quot;&gt;React.js - A HelloWorld example with Express and Node.js&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;因為接下來的範例同樣會以 Express 以及 Node.js 作為基本的環境&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;我們可以透過下面一連串的指令來初始化這次的範例&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/da2a2d1fc4f397e47047.js?file=init.sh&quot;&gt;&lt;/script&gt;
&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;上述的第5個指令安裝的 &lt;a href=&quot;https://github.com/andreypopp/reactify&quot;&gt;reactify&lt;/a&gt; 的元件，它是一個對於 JSX 的 browserify transform&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;原則上你沒有用 reactify 的話你是沒辦法透過 browserify成功 build 出結果的&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;而 reactify 內部也是使用 react-tools 這個元件來作 JSX 的轉換(上一篇有提到 react-tools)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接下來就可以開始寫一個簡單的 React 程式了&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/da2a2d1fc4f397e47047.js?file=app.js&quot;&gt;&lt;/script&gt;
&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;最後就是頁面的 Jade 程式&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/da2a2d1fc4f397e47047.js?file=index.jade&quot;&gt;&lt;/script&gt;
&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;跟先前的教學一樣，我們需要加入一個轉換 JSX 後的程式，先前是用 react-tools&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;這次我們就要透過 browserify&amp;nbsp;+ reactify&amp;nbsp;+ debowerify 來完成目前的範例&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在執行 browserify 的指令來執行 build 的過程前，需要修改一下 package.json&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;讓 browserify 能夠認得&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;transform&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/da2a2d1fc4f397e47047.js?file=package1.json&quot;&gt;&lt;/script&gt;
&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;完成後執行以下指令就會在 public/js/build 目錄下產生 build.js&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/da2a2d1fc4f397e47047.js?file=build.sh&quot;&gt;&lt;/script&gt;
&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;到這邊就大功告成了，接下來就用　npm start 啟動 node server 並瀏覽結果&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;最後附上這次範例的 source code &amp;gt;&amp;gt;&amp;gt;&lt;a href=&quot;https://github.com/AllenFang/react-debowerify-demo&quot;&gt;點我&lt;/a&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/5695112357830284063/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/03/reactjs-example-with-browserify-and.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/5695112357830284063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/5695112357830284063'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/03/reactjs-example-with-browserify-and.html' title='React.js - an example with browserify and debowerify'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-8908172048713598600</id><published>2015-03-07T16:31:00.001+08:00</published><updated>2015-03-07T16:34:30.458+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><title type='text'>AngularJS 教學 - Bootstrap dropdown directive</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;本篇用 AngularJS directive 實作了 一個 Bootstrap 的 dropdown (下拉式選單)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;
我有放在 GitHub&lt;span style=&quot;font-family: 標楷體; font-size: 12pt;&quot;&gt;、&lt;/span&gt;ngmodules.org&lt;span style=&quot;font-size: 12pt;&quot;&gt;，也有註冊在 Bower 上&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
GitHub 連結&lt;span style=&quot;font-size: 12pt;&quot;&gt;：&lt;span id=&quot;goog_1410733483&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_1410733484&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/AllenFang/angular-bootstrap-dropdown&quot;&gt;https://github.com/AllenFang/angular-bootstrap-dropdown&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ngmodules 連結：&lt;a href=&quot;http://ngmodules.org/modules/angular-bootstrap-dropdown&quot;&gt;http://ngmodules.org/modules/angular-bootstrap-dropdown&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Bower：可以透過以下指令安裝&lt;/span&gt;&lt;br /&gt;
&lt;pre style=&quot;background-color: black; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: white; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;bower install angular-bootstrap-dropdown --save&lt;/span&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;
詳細的使用介紹可以看 GitHub 的 README.md 文件&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;之後會加上 multi select 的功能 (有時間的話...)&lt;br /&gt;&lt;br /&gt;
基本使用方式：&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;line-height: 25.6000003814697px;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;bs-dropdown-display&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-size: 16px; line-height: 25.6000003814697px;&quot;&gt;屬性設定 dropdown 要顯示的文字&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;line-height: 25.6000003814697px;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;bs-dropdown-items&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-size: 16px; line-height: 25.6000003814697px;&quot;&gt;屬性設定 dropdown 選單內的 options&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;line-height: 25.6000003814697px;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;ng-model&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-size: 16px; line-height: 25.6000003814697px;&quot;&gt;設定 dropdown 的預設值&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;line-height: 25.6000003814697px;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;ng-change&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-size: 16px; line-height: 25.6000003814697px;&quot;&gt;當 dropdown 的值變動的時候會呼叫 的 callback function&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;background-color: #cccccc; line-height: 25.6000003814697px;&quot;&gt;bs-dropdown-divider&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-size: 16px; line-height: 25.6000003814697px;&quot;&gt;指定 dropdown 的分隔線的位置，例如： bs-dropdown-divider=&quot;{{[2,5]}}&quot;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;span style=&quot;background-color: white; color: #333333; font-size: 16px; line-height: 25.6000003814697px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white; color: #333333; font-size: 16px; line-height: 25.6000003814697px;&quot;&gt;以下為一個簡單的使用範例&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/bf100673334ff6947836.js?file=app.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/bf100673334ff6947836.js?file=index.html&quot;&gt;&lt;/script&gt;
&lt;span style=&quot;background-color: white; color: #333333; font-size: 16px; line-height: 25.6000003814697px;&quot;&gt;接下來是一個 Bootstrap dropdown divider 的使用範例&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/bf100673334ff6947836.js?file=app1.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://gist.github.com/AllenFang/bf100673334ff6947836.js?file=index1.html&quot;&gt;&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/8908172048713598600/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/03/angularjs-bootstrap-dropdown-directive.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/8908172048713598600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/8908172048713598600'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/03/angularjs-bootstrap-dropdown-directive.html' title='AngularJS 教學 - Bootstrap dropdown directive'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-4754177513563113241</id><published>2015-02-28T00:14:00.002+08:00</published><updated>2015-03-24T14:16:33.168+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Express"/><category scheme="http://www.blogger.com/atom/ns#" term="NodeJS"/><category scheme="http://www.blogger.com/atom/ns#" term="React.js"/><title type='text'>React.js - A HelloWorld example with Express and Node.js</title><content type='html'>&lt;span style=&quot;color: #073763; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;這篇來介紹一下如何快速的利用 Node.js 與 Express 來建立一個 React 的 HelloWorld 範例&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;React.js 的詳細介紹可以看&lt;a href=&quot;http://facebook.github.io/react/&quot;&gt;官網&lt;/a&gt;，之後有時間再來詳細介紹...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;首先要先快速建立一個 Express 與 Node.js 的 Project，可以用&amp;nbsp;&lt;span style=&quot;background-color: whitesmoke; color: #404040; font-size: 14px; line-height: 19.999979019165px; white-space: pre;&quot;&gt;express-generator&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;這是一個 Express project 的產生器，可以透過以下指令來安裝&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre style=&quot;background-color: black; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: white; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;npm install express-generator -g&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;完成後就再利用以下指令建立一個 Express 的 Project&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre style=&quot;background-color: black; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: white; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;express react-demo&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;進入&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;react-demo&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;目錄後可以看一到一個標準的 Express 的目錄結構&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接下來就要開始使用 React.js 了，在這之前需要下載 React.js 的函式庫&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;這邊我是透過 Bower 來管理前端 package&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;的，所以必須先安裝 Bower&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre style=&quot;background-color: black; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: white; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;npm install bower -g&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;完成之後先進入&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;react-demo 目錄內並建立 bower.json，&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;內容如下&lt;/span&gt;&lt;/div&gt;
&lt;pre style=&quot;background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; margin-bottom: 10px; padding: 9.5px; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span style=&quot;color: #333333; font-family: Monaco, Menlo, Consolas, Courier New, monospace;&quot;&gt;&lt;span style=&quot;line-height: 18.5714092254639px; white-space: pre-wrap;&quot;&gt;{
  &quot;name&quot;: &quot;react-demo&quot;,
  &quot;version&quot;: &quot;0.0.1&quot;
}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接下來就可以透過 Bower 來下載 React.js 了&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: black; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: white; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;bower install react --save
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;上述指令的 --save 自動在 bower.json 中加入 dependencies，並且你會在 react-demo 目錄下&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;看到一個新的資料夾 bower_components&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;為了等等讓 express 能夠認到 bower_components 底下的內容，我們必須修改react-demo 目錄下的 app.js&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;找到&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;app.use(express.static(path.join(__dirname, &#39;public&#39;)));&lt;/b&gt;&lt;/span&gt;&amp;nbsp;並在下一行加入：&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: red; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;app.use(&#39;/bower_components&#39;, &amp;nbsp;express.static(__dirname + &#39;/bower_components&#39;));&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;
完成之後就可以開始寫 React.js 的 Hello World 了，首先需要將 React.js 加載到網頁中&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;由於透過 express-generator 所建立的 template 預設是使用 Jade (當然你可以選擇其他的)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;所以我們必須修改 react-demo/views/layout.jade ，如下&lt;/span&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;doctype&lt;/span&gt; html
&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;html&lt;/span&gt;
&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;head&lt;/span&gt;
    &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot; style=&quot;box-sizing: border-box;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box;&quot;&gt;title&lt;/span&gt;
    &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;link&lt;/span&gt;(&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; color: teal;&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; color: #d01040;&quot;&gt;&#39;stylesheet&#39;&lt;/span&gt;&lt;span class=&quot;err&quot; style=&quot;background-color: #e3d2d2; box-sizing: border-box; color: #a61717;&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; color: teal;&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; color: #d01040;&quot;&gt;&#39;/stylesheets/style.css&#39;&lt;/span&gt;)
&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;body&lt;/span&gt;
    &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;block&lt;/span&gt; content
    &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;script&lt;/span&gt;(&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; color: teal;&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; color: #d01040;&quot;&gt;&#39;/bower_components/react/react.min.js&#39;&lt;/span&gt;)&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接下來在 react-demo/public/javascripts 目錄下建立一個 src 目錄&lt;/span&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: black; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: white; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;cd public/javascripts
&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;mkdir src
&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;cd src
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;並且在 src 目錄下建立 hello.js，其內容如下&lt;/span&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nx&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;p&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; color: black; font-weight: bold;&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; color: black; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;Hello, world&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; color: black; font-weight: bold;&quot;&gt;!&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot; style=&quot;background-color: #e3d2d2; box-sizing: border-box; color: #a61717;&quot;&gt;/p&amp;gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nb&quot; style=&quot;box-sizing: border-box; color: #0086b3;&quot;&gt;  document&lt;/span&gt;&lt;span class=&quot;p&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;p&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;box-sizing: border-box; color: #d01040;&quot;&gt;&#39;example&#39;&lt;/span&gt;&lt;span class=&quot;p&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot; style=&quot;box-sizing: border-box; color: #333333;&quot;&gt;);&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接下來我們範例是會透過&amp;nbsp;&lt;a href=&quot;http://facebook.github.io/react/docs/getting-started.html#offline-transform&quot;&gt;Offline Transform&lt;/a&gt;&amp;nbsp;來轉換 React 的 Template&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;所以需要先安裝一個 React 的轉換工具&lt;/span&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: black; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: white; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;npm install react-tools -g
&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;jsx --watch public/javascripts/src/ public/javascripts/build/
&lt;/pre&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以上指令完成後會在&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;public/javascripts/build/ 產生一個轉換後的 hello.js&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;這樣我們就可以把這個 hello.js 引入到頁面內了&lt;/span&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;doctype&lt;/span&gt; html
&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;html&lt;/span&gt;
&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;head&lt;/span&gt;
    &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot; style=&quot;box-sizing: border-box;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box;&quot;&gt;title&lt;/span&gt;
    &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;link&lt;/span&gt;(&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; color: teal;&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; color: #d01040;&quot;&gt;&#39;stylesheet&#39;&lt;/span&gt;&lt;span class=&quot;err&quot; style=&quot;background-color: #e3d2d2; box-sizing: border-box; color: #a61717;&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; color: teal;&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; color: #d01040;&quot;&gt;&#39;/stylesheets/style.css&#39;&lt;/span&gt;)
&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;body&lt;/span&gt;
    &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;block&lt;/span&gt; content&lt;/pre&gt;
&lt;pre style=&quot;background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;pl-ent&quot; style=&quot;background-color: white; box-sizing: border-box; color: #63a35c; font-family: Consolas, &#39;Liberation Mono&#39;, Menlo, Courier, monospace; font-size: 12px; line-height: 16.7999992370605px;&quot;&gt;     &lt;/span&gt;&lt;span style=&quot;color: navy;&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;pl-c1&quot; style=&quot;background-color: white; box-sizing: border-box; color: #0086b3; font-family: Consolas, &#39;Liberation Mono&#39;, Menlo, Courier, monospace; font-size: 12px; line-height: 16.7999992370605px;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pl-e&quot; style=&quot;background-color: white; box-sizing: border-box; color: #795da3; font-family: Consolas, &#39;Liberation Mono&#39;, Menlo, Courier, monospace; font-size: 12px; line-height: 16.7999992370605px;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Consolas, &#39;Liberation Mono&#39;, Menlo, Courier, monospace; font-size: 12px; line-height: 16.7999992370605px;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pl-s&quot; style=&quot;background-color: white; box-sizing: border-box; color: #183691; font-family: Consolas, &#39;Liberation Mono&#39;, Menlo, Courier, monospace; font-size: 12px; line-height: 16.7999992370605px;&quot;&gt;&#39;example&#39;&lt;/span&gt;&lt;span class=&quot;pl-c1&quot; style=&quot;background-color: white; box-sizing: border-box; color: #0086b3; font-family: Consolas, &#39;Liberation Mono&#39;, Menlo, Courier, monospace; font-size: 12px; line-height: 16.7999992370605px;&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style=&quot;background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;    &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;script&lt;/span&gt;(&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; color: teal;&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; color: #d01040;&quot;&gt;&#39;/&lt;/span&gt;&lt;span style=&quot;color: #d01040; line-height: normal;&quot;&gt;bower_components/react/react.min.js&#39;&lt;/span&gt;&lt;span style=&quot;line-height: 1.42857;&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; color: navy;&quot;&gt;script&lt;/span&gt;(&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; color: teal;&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; color: #d01040;&quot;&gt;&#39;/javascripts/build/hello.js&#39;&lt;/span&gt;)&lt;/pre&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;最後透過在 react-demo 目錄內執行以下指定&lt;/span&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: black; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: white; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; padding: 9.5px; white-space: pre-wrap; word-break: break-all; word-wrap: break-word;&quot;&gt;&lt;span class=&quot;nv&quot; style=&quot;box-sizing: border-box; color: white;&quot;&gt;$ &lt;/span&gt;npm start
&lt;/pre&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;並開啟瀏覽器，到 http://localhost:3000 就可以看到結果了&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
最後附上本次 demo 的&lt;a href=&quot;https://github.com/AllenFang/react-demo&quot;&gt;原始碼&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/4754177513563113241/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/02/reactjs-helloworld-example-with-express.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4754177513563113241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4754177513563113241'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/02/reactjs-helloworld-example-with-express.html' title='React.js - A HelloWorld example with Express and Node.js'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-962264580936209470</id><published>2015-02-12T18:00:00.000+08:00</published><updated>2015-02-12T18:00:53.290+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Solr"/><title type='text'>【Apache Solr】查詢與刪除 Collection</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;簡單介紹如何透過 RESTful 來執行 Collection 的查詢與刪除&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;這裡的查詢是指查詢 Collection 的 schema 資訊，可以透過 HTTP GET 以下的 URL 來取得 schema&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #cc0000; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;GET http://localhost:8983/solr/{collectionName}/schema&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;大致上 Solr 會將 schema.xml 的內容轉換成 JSON回傳回前端(預設)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;如果要用 XML 格式的話，在上述的 URL 後面加上 ?wt=xml 即可&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;至於要刪除 Collection 的話，可以利用以下的 URL 來完成&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #cc0000; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;GET http://localhost:8983/solr/admin/collections?action=DELETE&amp;amp;name={collectionName}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;如果你是在 SolrCloud 的環境下，想要連帶刪除該 Collection 的 config 的話，&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;可以用 Solr 提供的 shell script 來完成&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;$ cd solr-4.10.2/example/scripts/cloud-scripts&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;$ ./zkcli.sh -zkhost localhost:9983 -cmd clear &lt;span style=&quot;color: #0b5394; font-size: large;&quot;&gt;&lt;b&gt;{config path}&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在 SolrCloud 的環境下 Config 都是由 zookeeper 處理，如果要知道 config 的路徑&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;可以到 http://localhost:8983/solr/#/~cloud?view=tree 如下圖所示&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBQzK1Rt-BRBG5cvb8xkTgrck0lffZa4dxIiy5wDf6IA3R-a1BjuXBAmWiGU3Ls7vGzHcka5n4wJxWwXFy0_E1T4CTuSMjLukge10zbm03dSxggAqvwjKvUZkh5dvpCAQ3juLJ-FUTc7A/s1600/solr-delete-config.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBQzK1Rt-BRBG5cvb8xkTgrck0lffZa4dxIiy5wDf6IA3R-a1BjuXBAmWiGU3Ls7vGzHcka5n4wJxWwXFy0_E1T4CTuSMjLukge10zbm03dSxggAqvwjKvUZkh5dvpCAQ3juLJ-FUTc7A/s1600/solr-delete-config.png&quot; height=&quot;287&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;選擇你要刪除的 Config 目錄名稱，右邊會帶出一些資訊，並且在下方處有一個路徑&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;例如　/configs/allenCollection1， 這就是上述指令的 config path 了&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/962264580936209470/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/02/apache-solr-collection.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/962264580936209470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/962264580936209470'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/02/apache-solr-collection.html' title='【Apache Solr】查詢與刪除 Collection'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBQzK1Rt-BRBG5cvb8xkTgrck0lffZa4dxIiy5wDf6IA3R-a1BjuXBAmWiGU3Ls7vGzHcka5n4wJxWwXFy0_E1T4CTuSMjLukge10zbm03dSxggAqvwjKvUZkh5dvpCAQ3juLJ-FUTc7A/s72-c/solr-delete-config.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-6750643674157724930</id><published>2015-02-03T21:53:00.000+08:00</published><updated>2015-02-03T21:54:39.538+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Solr"/><category scheme="http://www.blogger.com/atom/ns#" term="SolrJ"/><title type='text'>【Apache Solr】 建立 Collection (Create Collection using SolrJ or RESTful)</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在 &lt;a href=&quot;http://programer-learn.blogspot.com/2015/01/apache-solr-collection-create-collection.html&quot;&gt;【Apache Solr】建立 Collection (Create Collection)&lt;/a&gt;&amp;nbsp;介紹了如何在 SolrCloud 中建立一個 Collection&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;當然也說明了一些建立 Collection 的一些條件，包括 Shard 的數量以及 Config 須先上傳到 Zookeeper&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接下來介紹一下如何用 SolrJ 以及 RESTful 的方式建立一個 Collection&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;SolrJ 是一個套件能夠讓開發者透過 Java 的方式來操作 Solr，以下是建立 Collection 的片段程式&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; code=&quot;java&quot;&gt;String zkHosts = &quot;locahost:9983&quot;;
String collectionName = &quot;testCollection1&quot;;
String confName       = &quot;testCollection1&quot;;  //Configuration Name (You must upload to zookeeper first)
int shards            = 3;
CloudSolrServer server = new CloudSolrServer(zkHosts);
CollectionAdminResponse response = CollectionAdminRequest.createCollection(
                                collectionName, shards, confName , server);

if(null != response.getErrorMessages()){
        /* print error here */
 for(Entry&lt;string string=&quot;&quot;&gt; error: response.getErrorMessages()){
  result.addErrorMsg(error.getValue());
 }
}
server.shutdown();
&lt;/string&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;CollectionAdminRequest 有很多的重載方法，可以去查它的 &lt;a href=&quot;https://lucene.apache.org/solr/4_10_0/solr-solrj/org/apache/solr/client/solrj/request/CollectionAdminRequest.html&quot;&gt;API&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;畢竟建立一個 Collection 有很多參數可以設定，包括 最大的 Shard 數量 或是 route field 等等的&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;另外你如果不想寫 Java，你也可以透過 HTTP 的 GET 方法請求一段 RESTful 來達到目地&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;例如以下的 URL 請求效果會跟上面的 SolrJ 範例程式相等&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;http://localhost:8983/solr/admin/collections?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; action=CREATE&amp;amp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name=testCollection1&amp;amp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; numShards=3&amp;amp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; collection.configName=testCollection1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;需要注意的是透過 RESTful 的方式不用指定 Zookeeper，但相對的你必須從你的 SolrCloud&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;中挑選任何一個節點來執行上述的 RESTful 請求&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;例如你有 host1 ~ host3 三個節點&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;那麼你對 host1, host2 或是 host3 發出上述的 RESTful (IP記得換掉)效果會是一樣的&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/6750643674157724930/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/02/apache-solr-collection-create.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/6750643674157724930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/6750643674157724930'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/02/apache-solr-collection-create.html' title='【Apache Solr】 建立 Collection (Create Collection using SolrJ or RESTful)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-5471002493607255908</id><published>2015-01-19T21:41:00.003+08:00</published><updated>2015-01-19T21:41:59.505+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="Karma"/><category scheme="http://www.blogger.com/atom/ns#" term="測試"/><title type='text'>AngularJS 教學 - Can not find the binary google-chrome</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;如果第一次在 Linux 的環境中利用 Karma 來執行測試的時候，&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;可能&lt;/span&gt;&lt;/b&gt;會看到類似下圖的錯誤&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;前提是你的測試瀏覽器是用 chrome 才會 &amp;nbsp;&amp;gt;&amp;gt; &lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;browsers: [&#39;Chrome&#39;]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTB-Z-slceZ5nItxNYNFady9nS4iffuPcV5KAh69SA3t5TT4ziOA9Sx1om4M3bOmsb5DO86ieotrKiqKAzGMRyZz-6IKn5PPuOwKKpX3RUjEzClEgAGi9DQ633FollFhFU6rJCZlqvkEA/s1600/cannotfindthegooglechrome.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTB-Z-slceZ5nItxNYNFady9nS4iffuPcV5KAh69SA3t5TT4ziOA9Sx1om4M3bOmsb5DO86ieotrKiqKAzGMRyZz-6IKn5PPuOwKKpX3RUjEzClEgAGi9DQ633FollFhFU6rJCZlqvkEA/s1600/cannotfindthegooglechrome.png&quot; height=&quot;80&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;很明顯的是 Karma 沒辦法透過環境變數 找不到 Chrome 的執行路徑&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;你可以透過指令&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;$ which chromium-browser 來找出 Chrome 的執行路徑&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;gt;&amp;gt; /usr/bin/chromium-browser&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接者加到環境變數 CHROME_BIN&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;$ echo &#39;export CHROME_BIN=&quot;/usr/bin/chromium-browser&quot;&#39; &amp;gt;&amp;gt; ~/.bashrc &amp;amp;&amp;amp; source ~/.bashrc&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;再執行一次 Karma 就可以了&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/5471002493607255908/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/01/angularjs-can-not-find-binary-google.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/5471002493607255908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/5471002493607255908'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/01/angularjs-can-not-find-binary-google.html' title='AngularJS 教學 - Can not find the binary google-chrome'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTB-Z-slceZ5nItxNYNFady9nS4iffuPcV5KAh69SA3t5TT4ziOA9Sx1om4M3bOmsb5DO86ieotrKiqKAzGMRyZz-6IKn5PPuOwKKpX3RUjEzClEgAGi9DQ633FollFhFU6rJCZlqvkEA/s72-c/cannotfindthegooglechrome.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-4613056118273424566</id><published>2015-01-12T21:45:00.001+08:00</published><updated>2015-01-12T21:45:27.139+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Solr"/><title type='text'>【Apache Solr】建立 Collection (Create Collection)</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在前一篇 &lt;a href=&quot;http://programer-learn.blogspot.tw/2015/01/apache-solrgetting-startedsolr-cloud.html&quot;&gt;【Apache Solr】Getting started：Solr Cloud configuration and example&lt;/a&gt;&amp;nbsp;提供了一個&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;關於 Solr Cloud 環境的建立與一些簡單的範例，接下來就繼續介紹如何建立 Collection&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在 Solr Cloud 的環境內要建立 Collection 之前必須要先有 Configuration&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;所謂的 Configuration 先前已經提到過了，就是類似在 $SOLR_INSTALL/example/solr/collection1/conf 內的所有內容&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;最重要的就是 solrconfig.xml 以及 schema.xml 了&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;當然不管是在 Cloud 還是 Single Node (單點) 的環境上都是需要 Configuration 的&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;不過 Solr Cloud 是需要將 Configuration 上傳到 Zookeeper，統一由 Zookeeper 做管理&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;我們可以透過以下指令來達成&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;$ cd solr-4.10.2/example/scripts/cloud-scripts/&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;$ ./zkcli.sh -zkHost localhost:9983&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -cmd upconfig&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -confdir {your configuration location}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -confname collection1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;上面的指令需要注意的是 -zkHost 需要換成你的 Zookeeper 位址&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;另外 -confir 則是指定你的 Configuration 所在的位置&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;最後 -confname 則是指定這次上傳上去的 Configuration 名稱&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;往後如果有 Collection 要建立都可以利用這個 Configuration 來建立&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;指令完成後你可以到 localhost:8983/solr 選擇左邊的 cloud 標籤內的 tree 標籤內觀察&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSB9-DuTHT1WbeUm-b5omI5wPv6C8IgpsyWyo155aeXzr4cXvRDQq05F6QYKzR_qt4SgJdMnKusem1TBUaMiAHJfMyc6o6tbrbEHtKdE555krzApI8ixcS38tPeRtpoeZPsRyincpK458/s1600/solr-config.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSB9-DuTHT1WbeUm-b5omI5wPv6C8IgpsyWyo155aeXzr4cXvRDQq05F6QYKzR_qt4SgJdMnKusem1TBUaMiAHJfMyc6o6tbrbEHtKdE555krzApI8ixcS38tPeRtpoeZPsRyincpK458/s1600/solr-config.png&quot; height=&quot;255&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接下來你可以透過 RESTful 的方式建立一個新的 Collection 叫 allentest&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;並透過 collection.configName 來指定新的 Collection 所需的 Configuration&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
你可以利用 瀏覽器直接輸入以下網址或是用其他工具(如：Postman &amp;gt; 好用!!)&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;GET http://localhost:8983/solr/admin/collections? &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;action=CREATE&amp;amp;name=allentest&amp;amp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;numShards=2&amp;amp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collection.configName=&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;collection1&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;最後你會看到以下的結果&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicqJEMXjY0EoK8QQnaYqJhY0sKsnoacGcIN7iIwHVXlNcO2Zup5HRR3W6k5W5HK7UxCPSG0tJae9BRaUeiHbxk0yRDQPed49KQa1hcFBsux0OYVEIjCp28iLIY5BnovaD2rqsOl5YGado/s1600/create-collection-result.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicqJEMXjY0EoK8QQnaYqJhY0sKsnoacGcIN7iIwHVXlNcO2Zup5HRR3W6k5W5HK7UxCPSG0tJae9BRaUeiHbxk0yRDQPed49KQa1hcFBsux0OYVEIjCp28iLIY5BnovaD2rqsOl5YGado/s1600/create-collection-result.png&quot; height=&quot;251&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;如果你不喜歡回傳的格式是 XML(這是 Solr 預設)的話，可以在網址後方加上&amp;amp;wt=json&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;之後在教大家如何用寫程式的方式在 SolrCloud 中建立 Collection.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/4613056118273424566/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/01/apache-solr-collection-create-collection.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4613056118273424566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4613056118273424566'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/01/apache-solr-collection-create-collection.html' title='【Apache Solr】建立 Collection (Create Collection)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSB9-DuTHT1WbeUm-b5omI5wPv6C8IgpsyWyo155aeXzr4cXvRDQq05F6QYKzR_qt4SgJdMnKusem1TBUaMiAHJfMyc6o6tbrbEHtKdE555krzApI8ixcS38tPeRtpoeZPsRyincpK458/s72-c/solr-config.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-2016654828982981164</id><published>2015-01-07T20:39:00.000+08:00</published><updated>2015-06-10T13:38:13.458+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Solr"/><title type='text'>【Apache Solr】Getting started：Solr Cloud configuration and example</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在前一篇 &lt;/span&gt;&lt;a href=&quot;http://programer-learn.blogspot.tw/2015/01/apache-solrgetting-started-installation.html&quot;&gt;&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;【Apache Solr】Getting started： Installation &amp;amp; A single node example&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;的教學&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;有簡單介紹 Solr 的細節和目錄結構以及如何配置單一節點的 Solr 並啟動 Solr 服務&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;也說明如何在單一節點上建立一個新的 core，接下來就介紹 Solr Cloud 分佈式的設定和一些簡單範例&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: large;&quot;&gt;分佈式(Cloud)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;叢集的效果就很像 Hadoop/HDFS 的樣子，資料是分佈式儲存，並透過 Zookeeper 來作協同管理，一個節點(Node)失效並不會造成資料遺失等問題，在 Solr 文件中都稱為 &quot;SolrCloud&quot;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以下範例同樣是以 Solr 跟目錄下的 example 為例&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;如何啟動&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ cd solr-4.10.2&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ cp -r example/ shard1/&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ cd&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;shard1&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ rm -r solr/collection1/data/&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 以上的動作會在 solr 跟目錄下建立一個&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;shard1&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;目錄，內容跟 example 目錄相仿&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 接下來在&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;shard1&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;目錄下執行以下 command&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ java -DzkRun -DnumShards=2 -Dcollection.configName=collection1&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-Dbootstrap_confdir=./solr/collection1/conf&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-jar start.jar&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 這裡先解釋一下，通常在實際上我們並不會這樣啟動一個 Solr Cloud，不過為了教學方便這裡先將就&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 以上指令&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;-DzkRun&lt;/span&gt;&lt;/b&gt; 表示了要用 Embed 的模式將 Zookeeper 啟動在目前這台機器上&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;b&gt;-DnumShards&lt;/b&gt;&lt;/span&gt; 表示了 Solr Cloud 擁有最大的 Shards(分片)數&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 通常在啟動 Solr Cloud 以上兩個會常用，接下來的兩個是因為教學原因才額外加上的&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; -Dbootstrap_confdir 指定了 Collection 的 Conf 路徑，啟動時，&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;Zookeeper 會將&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;　　　　　　　　　　　　　　conf 底下的東西上傳到&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;Zookeeper 底下做管理&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; -Dcollection.configName=指定了你目前需要初始化的 Collection 名稱&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 啟動完成之後在 http://localhost:8983/solr 點擊頁面左邊的 Cloud 標籤&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 你會看到 有一個 node 是 &lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;Active&lt;/span&gt;&lt;/b&gt; 另外一個是 &lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Close&lt;/span&gt;&lt;/b&gt; 的&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 接下來就是依照先前的步驟再做一個 node 出來，因為沒有兩台機器，&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 所以你可以直接在 Solr 跟目錄下再建一個&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;shard2&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;的目錄，且內容跟&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;shard1&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;一樣。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ cd solr-4.10.2&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ cp -r&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;shard1&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;/&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;shard2&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ cd&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;shard2&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ rm -r solr/collection1/data&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; $ java -DzkHost=localhost:9983 -Djetty.port=8984 -jar start.jar&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 在最後面的指令中，我又在本機上再啟動一個 Solr 服務，有幾個參數需注意&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;b&gt;-DzkHost&lt;/b&gt;&lt;/span&gt; 這是告訴 Solr 目前 Zookeeper 在哪台機器上，在剛才我們已經在本機建立一個 Embed 的&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ZooKeeper，&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;而 port 是 9983(這是 Solr預設)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; -Djetty.port 則是指定這個 Solr 服務的 port，因為剛才我們已經在本機開過一個 Solr 服務在 8983 了&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;所以你必須更換一個沒再用的 port 否則會啟動失敗&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;完成後，你就可以進入&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;http://localhost:8984/solr 了&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;如果你有兩台機器的話，你同樣可以在另外一台機器上下載 Solr，&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;　　　並且把剛剛建立的&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;shard2&lt;/span&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;資料夾放到那台機器上的 Solr 根目錄下&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;，&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;並且在執行一次，且需注意 Zookeeper 的位址，需改成 node1 的IP，不能再用 localhost&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;$ java &lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;-DzkHost={node1-ip}:9983&lt;/span&gt;&lt;/b&gt;&amp;nbsp;-jar start.jar&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以上因為教學介紹的關係，所以分享了這樣的 Solr Cloud 的啟動與配置方式&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;你可能注意到這樣的啟動方式，如果我要再額外建立另一個 Collection 到 Cloud 上&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;就要關掉並且把 conf 目錄擺好後再透過指令重新 bootstrap&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;所以在 Solr Cloud 中，Solr 有提供一些 script 可以讓你將 conf 目錄&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;上傳到 Zookeeper ，以成為一個新的 configuration name&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;之後使用者就可以透過 API 或是 RESTful 的方式，進立一個新的 collectioon 並且指定該 configuraion name&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;下一篇就來介紹一下　Solr Cloud 中的 configuration 是什麼，以及建立 Collection 的方式&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/2016654828982981164/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/01/apache-solrgetting-startedsolr-cloud.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/2016654828982981164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/2016654828982981164'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/01/apache-solrgetting-startedsolr-cloud.html' title='【Apache Solr】Getting started：Solr Cloud configuration and example'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-1308452052277897481</id><published>2015-01-06T21:36:00.000+08:00</published><updated>2015-01-09T11:48:40.455+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Solr"/><title type='text'>【Apache Solr】Getting started： Installation &amp; A single node example</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;a href=&quot;http://lucene.apache.org/solr/&quot;&gt;Apache Solr&lt;/a&gt;&amp;nbsp;是一個全文搜索的平台，能夠將多種格式的資料儲存在它的資料庫內，並提供快速的資料檢索&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Solr 在 2010 年的時候與 Apache 的另外一個專案 Lucene 合併，Lucene 其實就是整個資料搜尋的核心，&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;它提供了所有的資料搜尋與檢索的函式庫。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;而 Solr 則是利用了 Lucene 的搜尋功能並採用 Servlet container(預設是 Jetty) 來提供 REST，&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;及其他 API 的方式讓開發者能夠輕易的對資料進行查詢。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;--------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接下來以 Apache Solr 4.10.2 的版本來安裝並介紹&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;前提是你的作業系統內必須安裝 Java 7，如果你是 Java 6 的話可以考慮更新到 Java 7，&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;或是選擇 Solr 版本 4.7.0 以下的也是可以。&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;首先先到&amp;nbsp;&lt;a href=&quot;http://archive.apache.org/dist/lucene/solr/4.10.2/&quot;&gt;http://archive.apache.org/dist/lucene/solr/4.10.2/&lt;/a&gt;&amp;nbsp;下載合適你作業系統的壓縮檔&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以下以 Linux ubuntu 為例&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: black; color: white; font-family: Courier New, Courier, monospace;&quot;&gt;$ cd ~ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: black; color: white; font-family: Courier New, Courier, monospace;&quot;&gt;$ wget&amp;nbsp;http://archive.apache.org/dist/lucene/solr/4.10.2/solr-4.10.2.tgz&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: black; color: white; font-family: Courier New, Courier, monospace;&quot;&gt;$ ...... &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: black; color: white; font-family: Courier New, Courier, monospace;&quot;&gt;$ tar -zxf solr-4.10.2.tgz &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;完成之後會看到一個 solr-4.10.2 的資料夾，進入該目錄之後內容&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;如下圖&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGrmx7_IbvCK_50mNXLG8fgC1fKf2FqYDVkUxTUzq-iEfHTXhUPV_rVwmU3GsfTIdS4TkJanqmeFi272XxUNlBfFMY_ZYp0DJeuE6BWqCuY3XOLHJ-SHfhtwdNld2-_UhssAoK6NXJl_0/s1600/sole-home.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGrmx7_IbvCK_50mNXLG8fgC1fKf2FqYDVkUxTUzq-iEfHTXhUPV_rVwmU3GsfTIdS4TkJanqmeFi272XxUNlBfFMY_ZYp0DJeuE6BWqCuY3XOLHJ-SHfhtwdNld2-_UhssAoK6NXJl_0/s1600/sole-home.png&quot; height=&quot;366&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在該開始接觸 Solr 的人最重要的就是把 example 目錄下的結構和幾個檔案搞懂&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在 example 目錄下有幾個比較重要的檔案和目錄&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;1. &lt;span style=&quot;color: red;&quot;&gt;scripts 目錄&lt;/span&gt;：目錄內有一些 shell script 可以讓你操作 Zookeeper 和 MapReduce&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;2. &lt;span style=&quot;color: red;&quot;&gt;start.jar 檔&lt;/span&gt;：用來啟動 Solr 服務的 Jar 檔&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;3. &lt;span style=&quot;color: red;&quot;&gt;solr 目錄&lt;/span&gt;：它是你的 Solr home 的目錄，你建立的 Core 以及索引資料都在內，如下圖：&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0b0vXsQlMYGFOM0U-0pckdFKbIyC0xAmRbbeeIMaNEJ4YudaYQJVKAYhplO_QzsczsVtdyRVDOvUXzjnZH5pdTskwIm3bluypXNOMGwUiqGONATFVHG0umqn_L8S-kNsZ0yXMC8RLtsk/s1600/collection-home.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0b0vXsQlMYGFOM0U-0pckdFKbIyC0xAmRbbeeIMaNEJ4YudaYQJVKAYhplO_QzsczsVtdyRVDOvUXzjnZH5pdTskwIm3bluypXNOMGwUiqGONATFVHG0umqn_L8S-kNsZ0yXMC8RLtsk/s1600/collection-home.png&quot; height=&quot;366&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;在 solr 目錄下有一個 collection1 的目錄，他就是一個 Solr 提供的一個 Core 範例，&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;所以你如果有多個 core 的話，你就會在 solr 目錄下看到那些 core 名稱的目錄&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: red; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;在每個 core 目錄底下，需要注意的就是 conf 以及 data 目錄&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;1. conf 目錄內有著兩個最重要的設定檔&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;schema.xml&lt;/span&gt; 以及 &lt;span style=&quot;color: red;&quot;&gt;solrconfig.xml&lt;/span&gt;，前者描述了 core 的資料欄位和&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;資料&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;型態，後者則是定義一些關於 core 的設定&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;2. data 目錄顧名思義就是存放資料的地方&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;Solr 提供了兩種模式，一種是單點的另外一種則是分佈式的，以下依序介紹如何配置&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: large;&quot;&gt;單點(Single node)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;單點顧名思義就是只有一台 Solr 的伺服器再提供所有的服務，這在正式的 Production 環境上&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;是不太可能這樣配置的&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;如何啟動&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;background-color: black; color: white;&quot;&gt;$ cd&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: black; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;solr-4.10.2/example&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;background-color: black; color: white;&quot;&gt;$ java -jar start.jar &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 完成之後打開瀏覽器並輸入網址 http://localhost:8983/solr&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 你就會看到一個 solr 的管理頁面，就代表成功了&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;如何建立 core&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;background-color: black; color: white;&quot;&gt;$&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: black; color: white;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;cd&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;solr-4.10.2/example/solr &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span style=&quot;background-color: white; color: white;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: black; color: white;&quot;&gt;$ cp -r collection1/&lt;/span&gt;&lt;span style=&quot;background-color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: black; color: white;&quot;&gt;mycollection &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: black;&quot;&gt;$ cd mycollection &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: black;&quot;&gt;$ vi core.properties &amp;gt;&amp;gt; 改成name=mycollection&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: black;&quot;&gt;$ rm -r data/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 重新啟動 solr 之後你就會在&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;http://localhost:8983/solr 看到 mycollection&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; 當然你也可以再重啟之前適度的修改 schema.xml 來符合你的欄位設計&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: large;&quot;&gt;分佈式(Cloud)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;叢集的效果就很像 Hadoop/HDFS 的樣子，資料是分佈式儲存，並透過 Zookeeper 來作協同管理，一個節點(Node)失效並不會造成資料遺失等問題，在 Solr 文件中都稱為 &quot;SolrCloud&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;如何安裝與配置，因為篇幅稍多，所以留在下一篇再介紹&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;a href=&quot;http://programer-learn.blogspot.com/2015/01/apache-solrgetting-startedsolr-cloud.html&quot;&gt;【Apache Solr】Getting started：Solr Cloud configuration and example&lt;/a&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/1308452052277897481/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2015/01/apache-solrgetting-started-installation.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1308452052277897481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1308452052277897481'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2015/01/apache-solrgetting-started-installation.html' title='【Apache Solr】Getting started： Installation &amp; A single node example'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGrmx7_IbvCK_50mNXLG8fgC1fKf2FqYDVkUxTUzq-iEfHTXhUPV_rVwmU3GsfTIdS4TkJanqmeFi272XxUNlBfFMY_ZYp0DJeuE6BWqCuY3XOLHJ-SHfhtwdNld2-_UhssAoK6NXJl_0/s72-c/sole-home.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-1820953449978842897</id><published>2014-12-16T21:39:00.000+08:00</published><updated>2015-01-07T23:08:17.937+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Hadoop"/><category scheme="http://www.blogger.com/atom/ns#" term="Solr"/><title type='text'>java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.addDeprecations</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;這個錯誤訊息是因為不同的 Hadoop 版本所造成的&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;主要是因為&amp;nbsp;org.apache.hadoop.conf.Configuration 這個類別在 Hadoop 2.3 之後&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;新增了一個方法(method)&amp;nbsp;addDeprecations&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;出現這個問題就有可能代表你的環境內有 Hadoop 2.3 的 jar 以及比 2.3 還早的 jar&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;我會遇到這個問題是因為&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;我的專案本身透過 Maven 引入 Hadoop 2.3 的 package&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;另外也相依了 solr-core 4.1.0 這個 package&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;剛好 solr-core 4.1.0 它有相依 Hadoop 某些 jar，但卻是 Hadoop 2.2 的&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;可以在 &lt;a href=&quot;http://mvnrepository.com/artifact/org.apache.solr/solr-core/4.10.0&quot;&gt;Solr-core 4.1.0 maven repository&lt;/a&gt;&amp;nbsp;內看到，如下圖&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp4S-VJFuCbxGZMJl5nCGMOnPFLiwh30DjdeMNf1NRapS0-1tWGJJTo8CrDude0QHxuUP1pm7l8xbvohWqtFHc_wv3urHSAAP-pKC9a-341q_8pVrYa7BcJNDaW_fCpnmYV4HMcANYoGU/s1600/solr-hadoop.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp4S-VJFuCbxGZMJl5nCGMOnPFLiwh30DjdeMNf1NRapS0-1tWGJJTo8CrDude0QHxuUP1pm7l8xbvohWqtFHc_wv3urHSAAP-pKC9a-341q_8pVrYa7BcJNDaW_fCpnmYV4HMcANYoGU/s1600/solr-hadoop.png&quot; height=&quot;92&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;所以導致這樣的問題&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;解法部外乎就是把你專案本身的 Hadoop 2.3 降到 2.2&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;或是在 Maven 中用 exclusion 標籤排除掉以上那 4 個 jar &amp;nbsp;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/1820953449978842897/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2014/12/javalangnosuchmethoderror.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1820953449978842897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/1820953449978842897'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2014/12/javalangnosuchmethoderror.html' title='java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.addDeprecations'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp4S-VJFuCbxGZMJl5nCGMOnPFLiwh30DjdeMNf1NRapS0-1tWGJJTo8CrDude0QHxuUP1pm7l8xbvohWqtFHc_wv3urHSAAP-pKC9a-341q_8pVrYa7BcJNDaW_fCpnmYV4HMcANYoGU/s72-c/solr-hadoop.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-4664894113332831799</id><published>2014-11-01T17:31:00.003+08:00</published><updated>2014-11-01T17:31:50.178+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="Jasmine"/><category scheme="http://www.blogger.com/atom/ns#" term="測試"/><title type='text'>AngularJS 教學 - Mocking a service</title><content type='html'>在前一篇 &amp;nbsp;&lt;a href=&quot;http://programer-learn.blogspot.com/2014/10/angularjs-service.html&quot;&gt;AngularJS 教學 - Service 測試&lt;/a&gt;&amp;nbsp;有簡單介紹到如何對 Service 進行測試&lt;a href=&quot;https://www.blogger.com/&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
另外因為 Controller 常常需要依賴一些 Service Object 來做一些邏輯處理或後端的溝通&lt;br /&gt;
&lt;br /&gt;
因此也說明了運用了 $injector 來將 Service Object 注入到 Controller，以利 Controller 的測試&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
不過有時候在開發的過程中，常常會遇到我們所開發的元件中所相依的元件還沒開發完成或是是別人的工作&lt;br /&gt;
&lt;br /&gt;
例如我在開發某個 Controller 元件的時候，可能需要依賴很多的 Service&lt;br /&gt;
&lt;br /&gt;
但這些 Service 可能尚未完成等等之類的因素，但為了確保我的 Controller 能夠如期完成並政常運作&lt;br /&gt;
&lt;br /&gt;
先用模擬的方式來模擬這些 Service ，讓我的開發與測試能夠順利完成&lt;br /&gt;
&lt;br /&gt;
而這些被模擬的東西我們可以稱為 mock object 或是 fake object&lt;br /&gt;
&lt;br /&gt;
所以本篇會說明如何利用 $provide 來建立一個 mock 的 Service object&lt;br /&gt;
&lt;br /&gt;
假設在 SampleCtrl 中我們需要依賴一個 TodoService&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;angular.module(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&#39;sampleApp&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;,
[])&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .controller(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&quot;SampleCtrl&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;, &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;($scope,
TodoService){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scope.todos = TodoService.getTodos();&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;});&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
並且 TodoService 在還沒有被完成的情況下，那們我們該如何讓我們的 Controller 測試能夠通過&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;describe(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&quot;Controller
Test&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;, &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;(){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;
mockScope = {};&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt; controller
= &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;null&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;
mockService = &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;null&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beforeEach(angular.mock.module(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&quot;sampleApp&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;));&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beforeEach(angular.mock.module(&lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;($provide){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;//Create
a mock service object&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mockService = {&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; getTodos: &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;(){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;//Return
some mock data you expected&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;return&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt; [&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {id:1, name: &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&#39;Todo
item1&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;},&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {id:2, name: &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&#39;Todo
item2&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;}&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ];&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;//Using
$provide service to register a component with the $injector&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $provide.value(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&quot;TodoService&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;,
mockService);&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }));&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beforeEach(angular.mock.inject(&lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;($controller,
$rootScope, $injector){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mockScope = $rootScope.$new();&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; controller = $controller(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&quot;SampleCtrl&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;, {&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scope: mockScope, &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;　　　　　　　　&lt;/span&gt;&lt;b style=&quot;color: red; font-family: Consolas;&quot;&gt;//Using $injector to get service&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TodoService: $injector.get(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&quot;TodoService&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;)&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }));&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; it(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas;&quot;&gt;&quot;Should
get two Todo items from mock service&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;, &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;(){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; expect(mockScope.todos.length).toEqual(2);&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas;&quot;&gt;});&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
從上面的測試程式可以看到，在第二個 beforeEach 中&lt;br /&gt;
&lt;br /&gt;
我自己建立了一個 mock 的 service object，並且包含一個 getTodos 的方法&lt;br /&gt;
&lt;br /&gt;
方法內會回傳我所期待的 mock data&lt;br /&gt;
&lt;br /&gt;
完成之後再透過 $provide 的 value 方法將完成的 mock service 註冊名為 TodoService 的 Service&lt;br /&gt;
&lt;br /&gt;
所以我們就可以透過 $injector 來取得 TodoService 了&lt;br /&gt;
&lt;br /&gt;
之後再介紹利用 Jasmine 的 spy 的方式也可以達到 mocking 的效果!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/4664894113332831799/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2014/11/angularjs-mocking-service.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4664894113332831799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/4664894113332831799'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2014/11/angularjs-mocking-service.html' title='AngularJS 教學 - Mocking a service'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3309933229809673500.post-8517208125689044068</id><published>2014-10-30T21:47:00.002+08:00</published><updated>2014-10-30T21:47:21.637+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="Jasmine"/><category scheme="http://www.blogger.com/atom/ns#" term="Karma"/><category scheme="http://www.blogger.com/atom/ns#" term="測試"/><title type='text'>AngularJS 教學 - Service 測試</title><content type='html'>&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;本偏簡單介紹該如何測試 Service，並說明該如何在測試中解決依賴注入的問題(Dependency Injection)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
如果不太清楚 &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;AngularJS&lt;/span&gt; 的測試，可以看　&lt;a href=&quot;http://programer-learn.blogspot.com/2014/10/angularjs-unit-testing.html&quot;&gt;http://programer-learn.blogspot.com/2014/10/angularjs-unit-testing.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;以下是本次範例的頁面，在 Text Box 輸入名子，按下 Button 後，Text Box 的值就會改變&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJNpWV75lGYCDd6HeVKi1-ckTj91GgXBvNf4z4Mwktx-MFOPY5_KSGvbk_aeLEd2INBb0Ikp181US7yTXOgZnBVZHLTKxc4HjqDT4FEJdOpqLYi1yDAKswmmsvuorBpL6yhjVTt6U3wfc/s1600/service-test1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJNpWV75lGYCDd6HeVKi1-ckTj91GgXBvNf4z4Mwktx-MFOPY5_KSGvbk_aeLEd2INBb0Ikp181US7yTXOgZnBVZHLTKxc4HjqDT4FEJdOpqLYi1yDAKswmmsvuorBpL6yhjVTt6U3wfc/s1600/service-test1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
接下來看一下原始碼 &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;(index.html)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: silver; color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt; mso-highlight: silver;&quot;&gt;html&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;xmlns&lt;/span&gt;=&lt;i&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;http://www.w3.org/1999/xhtml&quot;&lt;/span&gt;&lt;/i&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;ng-app&lt;/span&gt;=&lt;i&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;sampleApp&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: teal;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;head&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;title&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;Demo&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;title&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;script&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;type&lt;/span&gt;=&lt;i&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt;&lt;/i&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;src&lt;/span&gt;=&lt;i&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;lib/angular.min.js&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: teal;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;script&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;type&lt;/span&gt;=&lt;i&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt;&lt;/i&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;src&lt;/span&gt;=&lt;i&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;js/app.js&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: teal;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;head&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;body&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;div&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;ng-controller&lt;/span&gt;=&lt;i&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;SampleCtrl&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: teal;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name:&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;input&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f007f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;type&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f007f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;ng-model&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;br&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;button&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt; &lt;span style=&quot;color: #7f007f;&quot;&gt;ng-click&lt;/span&gt;=&lt;i&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;echo()&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: teal;&quot;&gt;&amp;gt;&lt;/span&gt;Echo&lt;span style=&quot;color: teal;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f;&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;div&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;body&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: silver; color: #3f7f7f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt; mso-highlight: silver;&quot;&gt;html&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: teal; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;再來看定義 Controller 以及 Service 的程式 (js/app.js)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;angular.module(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&#39;sampleApp&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;,
[])&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp; &amp;nbsp;.controller(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;SampleCtrl&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;, &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;($scope,
SampleService){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scope.name = &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scope.echo = &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;(){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scope.name =
SampleService.echo($scope.name);&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp; &amp;nbsp;})&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;.factory(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&quot;SampleService&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;, &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;(){&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;return&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt; {&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;echo:
&lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;(name){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;return&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;Hello
&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt; + name;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;};&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp; &amp;nbsp;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;上面的程式都相當容易，接著主要就要來看測試的部分&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;首先是 &amp;nbsp;Karma 的設定檔 (karma.conf.js)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;module.exports
= &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;(config) {&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;config.set({&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;basePath: &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;frameworks: [&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&#39;jasmine&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red; font-family: Consolas; font-size: x-small;&quot;&gt;&lt;b&gt;/*&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: red; font-family: Consolas; font-size: x-small;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; * 加載所需的js檔到瀏覽器中&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: red; font-family: Consolas; font-size: x-small;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; * 除了需要將要被測試程式與測試程式加入之外&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: red; font-family: Consolas; font-size: x-small;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; * 也須將 angularjs 的library(angular.min.js)以及&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: red; font-family: Consolas; font-size: x-small;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; * angular-mocks.js 加載進去&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: red; font-family: Consolas; font-size: x-small;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; * */&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;files: [&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&#39;lib/angular.min.js&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&#39;lib/angular-mocks.js&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&#39;js/*.js&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&#39;qa/*.js&#39;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;exclude: [&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;preprocessors: {&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;},&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;reporters: [&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&#39;progress&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;port: 9876,&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;colors: &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;true&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;logLevel: config.LOG_INFO,&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;autoWatch: &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;true&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;browsers: [&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&#39;Chrome&#39;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp; &amp;nbsp;singleRun: &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;false&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;});&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;接著我們先來看如何對 SampleService 進行單元測試(qa/service-test.js)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;describe(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;Controller
Test&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;, &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;(){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;
mockService;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f5f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;// mock our module&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beforeEach(angular.mock.module(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;sampleApp&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;));&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #3f7f5f; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;// mock service object &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beforeEach(angular.mock.inject(&lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;($injector){&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: red; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;// using
$injector retrieve object instances as defined by provider&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 13px;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;mockService
= $injector.get(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10pt;&quot;&gt;&quot;SampleService&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }));&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; it(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;The
echo function should return &#39;Hello {name}&#39;&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;, &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;(){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;
name = &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;Allen&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; expect(mockService.echo(name)).toEqual(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;Hello
&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;+name);&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;最後則是 Controller 的測試，同樣的因為 Controller 會將我們定義的 SampleService 注入&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;所以在測試的時候同樣可以用 $injector 來取得一個 mock 的 service 物件，&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;並透過 $controller 的 constructor 注入給 Controller 物件(qa/controller-test.js)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;describe(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;Controller
Test&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;, &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;(){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;
mockScope = {};&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt; controller
= &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;null&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beforeEach(angular.mock.module(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;sampleApp&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;));&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beforeEach(angular.mock.inject(&lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;($controller,
$rootScope, $injector){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mockScope = $rootScope.$new();&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; controller = $controller(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;SampleCtrl&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;, {&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $scope: mockScope, &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;SampleService: $injector.get(&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&quot;SampleService&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }));&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; it(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;he
echo function should return &#39;Hello {name}&#39;&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;, &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;function&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;(){&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #7f0055; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;
name = &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;Allen&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mockScope.name = name;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mockScope.echo(name);&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; expect(mockScope.name).toEqual(&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #2a00ff; font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&quot;Hello
&quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;+name);&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10.0pt; mso-fareast-font-family: 新細明體; mso-fareast-theme-font: minor-fareast; mso-font-kerning: 0pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: Consolas; font-size: 10pt;&quot;&gt;});&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
最後透過 &lt;span style=&quot;background-color: black; color: white; font-family: Courier New, Courier, monospace;&quot;&gt;$karma start&amp;nbsp;karma.conf.js&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt; 來進行測試&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://programer-learn.blogspot.com/feeds/8517208125689044068/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://programer-learn.blogspot.com/2014/10/angularjs-service.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/8517208125689044068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3309933229809673500/posts/default/8517208125689044068'/><link rel='alternate' type='text/html' href='http://programer-learn.blogspot.com/2014/10/angularjs-service.html' title='AngularJS 教學 - Service 測試'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09515334229353767523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJNpWV75lGYCDd6HeVKi1-ckTj91GgXBvNf4z4Mwktx-MFOPY5_KSGvbk_aeLEd2INBb0Ikp181US7yTXOgZnBVZHLTKxc4HjqDT4FEJdOpqLYi1yDAKswmmsvuorBpL6yhjVTt6U3wfc/s72-c/service-test1.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>