[Angular]Rxjs的Observers
Angular2裡面有用到RxJS的Extensions. 那這個Extendsion會帶給Angular2怎樣的幫助,來研究一下Http的程式碼吧
Angular發佈RC了,來升級吧
Angular Component 處理styles有三種模式 1. ViewEncapsulation.None: 適用於全部頁面(No Shadow DOM) 2. ViewEncapsulation.Native: 僅套用於Shadow DOM自己本身 3. ViewEncapsulation.Emulated: 預設行為。 會自動將每個component給予一個名稱,讓各compoent裡面的style會各自獨立
先來看第1,2種,看看style會被放在哪一個位置
1 | @Component({ |

2.ViewEncapsulation.Native
1 | @Component({ |

注意到ViewEncapsulation.Native將ViewEncapsulation.None的和本身定義的Style都包含在Shadow DOM裡面,這表示該Componenet與外面已經分開了. 本身所定義的css樣式不會影響到別人了
1 | @Component({ |
1 | <style>h3[_ngcontent-jfs-3] { |

在Angular2的Form, 可以使用[(ngModel)]的方式或是使用 ngFormModel的方式(如下)。 ngModel就不多描述,用法跟Angular1.x一樣
1 | <form [ngFormModel]="form" (submit)="add($event)"> |
js的部分如下
1 | import { Component } from 'angular2/core'; |
有幾個新東西出現. ngFormModel, ngControl. 這些都包含在FORM_DIRECTIVES裡.
FormBuilder是用來組合東西給ngFormModel用, 是把Control包在一起 builder.group({ … controls}) Control是配合ngControl使用. 初始是 new Control(『default value』, validator, asyncValidator)
這樣的設定方式,可以讓Form上的動作都在javascript裡面設定。單純html的程式碼
1 | NumberValueAccessor.prototype.registerOnChange = function (fn) { |
1 | // var defaultLocale = 'en-US'; 修改這裡。參數可以參考moment.js網站 |
Angular2的預設route模式是html5,這個在跑到其他頁面後,在重新整理頁面後會出現空白頁面,這是因為找不到Index的入口了。所以解決方式就是要讓MVC Core可以每次都載入Index.html頁面(如果純靜態頁面的方式)
在startup.cs的Configure function, 加入以下程式碼
1 | app.Use(async (context, next) => |
在Angular2的index.ts裡設定讓所有的request的header都新增 X-Custom-Header=api,讓server判斷是否為api call
1 | import { HTTP_PROVIDERS, BaseRequestOptions, RequestOptions, Headers } from 'angular2/http'; |
這樣子就可以讓Angular2跑到不同頁面時,不會因為重新整理而出現空白的畫面
如果是用Controller/View的方式,設定方法比照舊的設定方式即可
Redux2的middleware是介於action和reducer之間。例如: ReduxThunk. 設定方式是在建立store時,將middleware指定給store即可
寫自訂的middleware基本架構如下
1 | import isPromise from '../utils/is-promise'; |
store的設定方式如下
1 | function configureStore(initialState) { |
參考文件: - middleware - redux-thunk
在Part 1提到在aciton裡面,如果有需要呼叫api的行為,都會發生這個階段 目前有發現有兩種方式可以處理api.
如果利用第二種方式處理api call時,可以直接寫在action裡面。但是如果想要利用angular的service方式時,就要繞一下路了 但是,還是先簡單的寫一下fetch的方式
1 | export function loadTodo() { |
利用service的code如下
1 | import {Injectable, Inject } from 'angular2/core'; |
Redux是根據Facebook的flux所產出的一個架構. 簡單介紹請參考這裡
簡單的動作及資料流程如下

複雜一點的流程圖如下

每一個階段都有他應該要做的事情
- Action: 處理資料,呼叫API, 任何有可能產生副作用的行為都在這階段處理, 通常都是回傳JSON object.
- Reducer: 根據Action傳來的動作和資料,來決定與原本的資料(In Store)的關係,例如、新增、更新、移除或過濾等,回傳要顯示在View上面的資料
##程式碼 @Component程式的基本架構
1 | import { |
TodoPage.html
1 | <div class="clearfix mx-auto col-8"> |
###註冊Store as provider in Angular2 application
1 | import { enableProdMode, provide } from 'angular2/core'; |
store/configureStore
1 | ///<reference path="./dev-types.d.ts"/> |
actions/Todo
1 | import { TODO_ADD, TODO_REMOVE } from '../constants'; |
reducers/index
1 | import { combineReducers } from 'redux'; |
reducers/todo.ts
1 | import { fromJS, List } from 'immutable'; |
參考資料: - Angular 2 — Introduction to Redux - Angular 2 and Redux - redux - ng2-redux - immutable.js - work with service
今天透過Visual studio 2015 執行webpack時,竟然返回錯誤訊息。
我確定該webpack.config.js是可以跑的,但是為什麼在Visual studio 2015裡面執行卻是不行的,結果發現理由是node跟npm的版本有關係
我的webpack.config.js裡面有下’use strict’; 然後有使用到const, 所以VS就不開心了. 因為所使用的node版本不認識ES2015的東西.
解決方式是讓visual studio執行npm command時,使用本機電腦所使用的版本而不是Visual studio本身所用的版本, 將 ** $(PATH)**移到最上面

這樣子的設定就可以讓VS在執行npm時,就會按照上圖的順序去找執行