顯示具有 AngularJS 標籤的文章。 顯示所有文章
顯示具有 AngularJS 標籤的文章。 顯示所有文章

2015年3月22日 星期日

Facebook/Flux 架構分享

現在 react/flux 在網路上的分享或教學已經很多了,有興趣的可以上網找一些相關的資訊

react 與 flux 的搭配算是目前正興起的一像前端開發手法

flux 是 Facebook 提供的一套前端設計模式,也可以說是一個架構

react 就不多說了,之前有文章介紹過了,去年看到 flux 的架構設計之後

特別有看到 Facebook 的介紹有提到,他們認為 flux 的架構設計是比較適合大型的前端應用的

另外也有提到前端 MVC 架構中的一些缺點,我是有部分認同他們給出來的一張圖













上面這個例子或許是大多數大型前端應用會遇到的難題,這已經跟 MVC 用不用得好沒關係了

在這之前曾經寫過大型的 backbone 程式,寫到最後(Model & View)就真的跟上面有點╰(〒皿〒)╯

雖然後續我認為 backbone 不能很根本地稱做 MVC,至少要額外加入 marionette 與 stickit

透過 marionette 補足 Controller, 並利用 stickit 來實現 Model 與 View 之間的 two-way binding

2015年3月16日 星期一

AngularJS 分享 - Bootstrap Grid system directive

這篇同樣分享一下之前實作的一個 AngularJS directive,這個 directive 是用來呈現一個 Bootstrap 的 Grid system

不知道什麼是 Bootstrap 的 Grid system 可以 >>看這邊<<

比較複雜的是 要如何用 AngularJS 現有的 directive 來組成一個可變動的 Grid

因為我不想直接用程式刻,所以都是通過 template 以及像是 ng-if,ng-init 以及 ng-repeat 這些 directive 來達成

當然實作的方式有好有壞啦,用程式刻我認為會稍微地好理解

但是你如果能充分利用原有的 direcitve 搭配 template 或許會讓你對 AngularJS directive 的開發更容易掌握

下圖是這次範例實作出來的結果(將所有的 products 以 grid system 呈現,每列三欄)

2015年3月11日 星期三

AngularJS 分享 - Pagnation Directive (分頁)

前陣子無聊就來練習一下 AngularJS 的 Directive (現在我還是覺得 AngularJS 的 Directive 和它的測試是真的有那麼一點複雜...)

之後稍微搞懂 Directive 之後就馬上順手寫了一個 AngularJS 的分頁元件

這個分頁 Directive 的樣式是基於 Bootstrap 3 的,程式內容不會介紹太多,純粹分享原始程式



2015年3月7日 星期六

AngularJS 教學 - Bootstrap dropdown directive

本篇用 AngularJS directive 實作了 一個 Bootstrap 的 dropdown (下拉式選單)

我有放在 GitHubngmodules.org,也有註冊在 Bower 上


GitHub 連結https://github.com/AllenFang/angular-bootstrap-dropdown

ngmodules 連結:http://ngmodules.org/modules/angular-bootstrap-dropdown
Bower:可以透過以下指令安裝
$ bower install angular-bootstrap-dropdown --save

詳細的使用介紹可以看 GitHub 的 README.md 文件


之後會加上 multi select 的功能 (有時間的話...)

基本使用方式:

bs-dropdown-display 屬性設定 dropdown 要顯示的文字
bs-dropdown-items 屬性設定 dropdown 選單內的 options
ng-model 設定 dropdown 的預設值
ng-change 當 dropdown 的值變動的時候會呼叫 的 callback function
bs-dropdown-divider 指定 dropdown 的分隔線的位置,例如: bs-dropdown-divider="{{[2,5]}}".

2015年1月19日 星期一

AngularJS 教學 - Can not find the binary google-chrome

如果第一次在 Linux 的環境中利用 Karma 來執行測試的時候,可能會看到類似下圖的錯誤

前提是你的測試瀏覽器是用 chrome 才會  >> browsers: ['Chrome']








很明顯的是 Karma 沒辦法透過環境變數 找不到 Chrome 的執行路徑

你可以透過指令

$ which chromium-browser 來找出 Chrome 的執行路徑
>> /usr/bin/chromium-browser

接者加到環境變數 CHROME_BIN

$ echo 'export CHROME_BIN="/usr/bin/chromium-browser"' >> ~/.bashrc && source ~/.bashrc

再執行一次 Karma 就可以了

2014年11月1日 星期六

AngularJS 教學 - Mocking a service

在前一篇  AngularJS 教學 - Service 測試 有簡單介紹到如何對 Service 進行測試

另外因為 Controller 常常需要依賴一些 Service Object 來做一些邏輯處理或後端的溝通

因此也說明了運用了 $injector 來將 Service Object 注入到 Controller,以利 Controller 的測試


不過有時候在開發的過程中,常常會遇到我們所開發的元件中所相依的元件還沒開發完成或是是別人的工作

例如我在開發某個 Controller 元件的時候,可能需要依賴很多的 Service

但這些 Service 可能尚未完成等等之類的因素,但為了確保我的 Controller 能夠如期完成並政常運作

先用模擬的方式來模擬這些 Service ,讓我的開發與測試能夠順利完成

而這些被模擬的東西我們可以稱為 mock object 或是 fake object

所以本篇會說明如何利用 $provide 來建立一個 mock 的 Service object

假設在 SampleCtrl 中我們需要依賴一個 TodoService

angular.module('sampleApp', [])
     .controller("SampleCtrl", function($scope, TodoService){
     $scope.todos = TodoService.getTodos();
 });

2014年10月30日 星期四

AngularJS 教學 - Service 測試

本偏簡單介紹該如何測試 Service,並說明該如何在測試中解決依賴注入的問題(Dependency Injection)

如果不太清楚 AngularJS 的測試,可以看 http://programer-learn.blogspot.com/2014/10/angularjs-unit-testing.html

以下是本次範例的頁面,在 Text Box 輸入名子,按下 Button 後,Text Box 的值就會改變












接下來看一下原始碼 (index.html)

<html xmlns="http://www.w3.org/1999/xhtml" ng-app="sampleApp">
     <head>
         <title>Demo</title>
         <script type="text/javascript" src="lib/angular.min.js"></script>
         <script type="text/javascript" src="js/app.js"></script>
     </head>
     <body>
         <div ng-controller="SampleCtrl">
              Name:<input type="text" ng-model="name"/>
              <br/><button ng-click="echo()">Echo</button>
         </div>
     </body>

</html>

2014年10月27日 星期一

AngularJS 教學 - Controller 測試

這篇要簡單介紹一下 AngularJS Controller 的測試該如何實現

以下還是用 Karma + Jasmine 來進行測試,如果不熟悉這些可以先看之前寫的文章 AngularJS 教學 - 單元測試(Unit Testing)

首先先列出我們要測試的範例程式,範例很簡單

頁面上有兩個 Button 負責針對 counter 的值進行遞增或遞減

以下是 index.html 的範例程式

<html xmlns="http://www.w3.org/1999/xhtml" ng-app="sampleApp">
     <head>
         <title>Demo</title>
         <script type="text/javascript" src="lib/angular.min.js"></script>
         <script type="text/javascript" src="js/app.js"></script>
     </head>
     <body>
         <div ng-controller="SampleCtrl">
              Counter : {{counter}}<br/>
              <button ng-click="add()">Increase</button><br/>
              <button ng-click="minus()">Decrease</button>
         </div>
     </body>

</html>


再來是 SampleCtrl 的程式(js/app.js)

2014年10月25日 星期六

AngularJS 教學 - 單元測試(Unit Testing)

本篇先小篇幅介紹如何建構一個 AngularJS 的單元測試

內容很簡單,之後再放上進一步的介紹,包括 Controller、Service、Ajax 等等

單元測試顧名思義就是要能夠確保程式的某個 function 或是部分的程式邏輯是正確的

至於單元測試所帶來的好處就不花時間描述了

不過單元測試除了驗證正確性外其實也是描述了系統的 Spec (Specification)

也就是單元測試中的每一個測試函式就表明了一件 Spec

回歸到 AngularJS 上,目前 JavaScript 領域中有很多單元測試的框架(Testing Framework)

包括 QUnit、Mocha、Jasmine 等等

除了測試框架之外還有所謂的 Testing Runner

例如我們接下來要介紹的 Karma,它不同於 Testing Framework

2014年9月23日 星期二

AngularJS 教學 - Java RESTful 範例

AngularJS 教學 - $resource service 詳細介紹到如何使用 ngResource 的 $resource service 進行後端的 RESTful 溝通

所以我花點時間打算寫一些 AngularJS RESTful 一個完整的前後端範例

可能想到要用 Java 和 Node.js 作為範例後端吧,所以本篇先提供以 Java 為後端的範例程式吧


以下我用 Todo 作為範例,整個程式我並不會介紹太多,基本的可以先看 AngularJS 教學 - $resource service

先列出專案目錄結構





























2014年9月17日 星期三

AngularJS 教學 - $resource service

這篇要來介紹一下 AngularJS 提供的一個 Service,就是 $resource

$resource 讓你能夠容易地和後端的 RESTful Service 做溝通,以便建構出一個 CRUD 的應用

$resource 也是建構在 $http 之上,其中 $http 提供了 AngularJS 一個執行 Ajax 的方式

如果對 $http 不熟的可以看 AngularJS 教學 - AjaxAngularJS 教學 - Ajax(1)

接下來就開始介紹   如何利用 $resource 來與 RESTful Service 溝通


1.準備 angular-resource.js
首先要使用 $resource,需要先額外引入 angular-resource.js 到你的 HTML 內

因為 $resource 並不在原本 AngularJS 核心的 JS 檔案內,所以才需要額外引入 JS 檔



2.一個 Todo REST 範例
URL
Method
Body
Result
/todos
GET
Nothing
Get all Todos
/todos
POST
Todo JSON String
Add a Todo
/todos/:id
GET
Nothing
Get a Todo by id
/todos/:id
PUT
Todo JSON String
Update a Todo
/todos/:id
DELETE
Nothing
Delete a Todo


2014年9月10日 星期三

AngularJS 教學 - Ajax(1)

上一篇 簡單介紹了 AngularJS 使用 Ajax 的方式 接下來繼續介紹一些 AngularJS 常用的 Ajax 設定

AngularJS 利用 $http 這個 Service 物件做為 Ajax 的一個管道

但是在多數複雜的應用中,我們的 Ajax 請求或回傳可能稍微複雜需要設定一些額外的參數

譬如說 HTTP 的請求表頭、HTTP 的 method(POST、PUT、DELET)之類的

所以以下列出幾個比較常用到的參數設定

首先在上一篇看過一個簡單的 Ajax 方式,如下:

$http.get("todos.json").success(function (data) {
    return data;
});

如果要加上額外的設定,可以類似這樣:

var config = {
    //你的設定參數在這
};
$http.post("/todos", config).success(function (data) {
    return data;
});

2014年8月16日 星期六

AngularJS 教學 - 模組化及開發模式

AngularJS 提供了一個 Javascript 的 MVC 框架讓開發者能夠輕易的在前端開發中實現 MVC 架構

但我認為 AngularJS 帶給前端開發者最重要的思維還是模組化以及開發模式

先從模組化談起

模組化(Modularity)已經是前端開發中一個很重要的準則了,就像大部分書籍說的

模組化能夠讓我們更能夠輕易重用(reuse)各個模組,另外能夠讓你容易地進行測試

也能夠幫助開發者快速並明確地釐清一個大型的前端應用的架構

但要組織一個大量模組間相互依賴的關係其實是一個蠻重要的課題

如果處理不當容易造成模組間的緊密耦合關係,並且降低重用性以及難於測試

要如何解耦?你可以透過 Mediator Pattern 或是 Observer Pattern 這類型的設計模式

這其實就有點像是 Event Driven Development

2014年8月3日 星期日

AngularJS 教學 - Ajax

AngularJS 教學 - MVC 介紹 中有特別提到 Model(模型) 的職責

其中一項就是用來跟後端作資料的操作 (CRUD)

而 AngularJS 提供了 REST 以及 Ajax 這兩種方式讓你能夠跟後端的應用程式作溝通

以下就介紹 AngularJS 的 Ajax 方法吧

首先 AngularJS 提供了 一個 Service 讓開發者能夠運用 Ajax,那個 Service 就叫做 $http

當你的模組需要用到 Ajax 的時候,可以將 $http 直接注入到你的模組中,就像 Controller 的 $scope 一樣

接著就看一下一個簡單的範例吧

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" ng-app="demoApp">
     <head>
         <title>Examples</title>
         <script type="text/javascript" src="js/angular.min.js"></script>
         <script>
              var demoApp = angular.module("demoApp", []);
              demoApp.factory("Todo", function($http){
                  return {
                       list: function(){
                            $http.get("todos.json").success(function (data) {
                                return data;
                            });
                       }
                  };
              });
              demoApp.controller("demoCtrl", function($scope, Todo){
                  $scope.loadData = function(){
                       $scope.todos = Todo.list();
                  }
             });
         </script>
     </head> 
     <body>
         <div ng-controller="demoCtrl">
              <button ng-click="loadData()">Load Todos</button></br>
              <table>
                  <tr>
                       <td>NO.</td><td>Name</td><td>Priority</td>
                  </tr>
                  <tr ng-repeat="todo in todos">
                       <td>{{todo.id}}</td>
                       <td>{{todo.name}}</td>
                       <td>{{todo.priority}}</td>
                  </tr>
              </table>
         </div>
     </body>

</html>

2014年7月23日 星期三

AngularJS 教學 - provider method

在前兩篇
AngularJS 教學 - factory method
AngularJS 教學 - service method

介紹到了三種建立 service 的其中兩個方法,factory 與 service

最後就要來介紹第三種方法,provider

provider 方法是 AngularJS Module 所提供的一個建立 Service 的方法 (Module.provider)

provider 方法與其他兩個最大的不同在於它能夠對 Service Object 做額外的設定(Configured)

再談到如何做額外的設定之前,我們先來看一個基本的 provider 方法如何使用

var demoApp = angular.module("demoApp", []);
demoApp.provider("echoService", function(){
return {  //It's Provider Object
$get: function(){
            return {  //It's Service Object
               echoCount: 0,
               echo: function(name){
                   console.log((this.echoCount++) + ", Your name is " + name);
               }
            };
        }
}

});