在AngularX中使用ngrx 【附源碼】

来源:http://www.cnblogs.com/besuccess/archive/2017/07/09/7140834.html
-Advertisement-
Play Games

ngrx 是 Angular框架的狀態容器,提供可預測化的狀態管理。 1.首先創建一個可路由訪問的模塊 這裡命名為:DemopetModule。 包括文件:demopet.html、demopet.scss、demopet.component.ts、demopet.routes.ts、demopet ...


ngrx 是 Angular框架的狀態容器,提供可預測化的狀態管理。

1.首先創建一個可路由訪問的模塊 這裡命名為:DemopetModule。

   包括文件:demopet.html、demopet.scss、demopet.component.ts、demopet.routes.ts、demopet.module.ts

    代碼如下:

 demopet.html

<!--暫時放一個標簽-->
<h1>Demo</h1>

 demopet.scss

h1{
    color:#d70029;
}

demopet.component.ts

import { Component} from '@angular/core';

@Component({
  selector: 'demo-pet',
  styleUrls: ['./demopet.scss'],
  templateUrl: './demopet.html'
})
export class DemoPetComponent {
    //nothing now...
}

demopet.routes.ts

import { DemoPetComponent } from './demopet.component';

export const routes = [
  {
    path: '', pathMatch: 'full', children: [
      { path: '', component: DemoPetComponent }
    ]
  }
];

demopet.module.ts

import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { routes } from './demopet.routes';

@NgModule({
  declarations: [
    DemoPetComponent,
  ],
  imports: [
    CommonModule,
    FormsModule,
    RouterModule.forChild(routes)
  ],
  providers: [
  ]
})
export class DemoPetModule {


}

整體代碼結構如下:

運行效果如下:只是為了學習方便,能夠有個運行的模塊

 

2.安裝ngrx

npm install @ngrx/core --save

npm install @ngrx/store --save

npm install @ngrx/effects --save

@ngrx/store是一個旨在提高寫性能的控制狀態的容器

 

3.使用ngrx

首先瞭解下單向數據流形式

代碼如下:

pet-tag.actions.ts

import { Injectable } from '@angular/core';
import { Action } from '@ngrx/store';

@Injectable()
export class PettagActions{
    static LOAD_DATA='Load Data';
    loadData():Action{
        return {
            type:PettagActions.LOAD_DATA
        };
    }

    static LOAD_DATA_SUCCESS='Load Data Success';
    loadDtaSuccess(data):Action{
        return {
            type:PettagActions.LOAD_DATA_SUCCESS,
            payload:data
        };
    }


    static LOAD_INFO='Load Info';
    loadInfo():Action{
        return {
            type:PettagActions.LOAD_INFO
        };
    }

    static LOAD_INFO_SUCCESS='Load Info Success';
    loadInfoSuccess(data):Action{
        return {
            type:PettagActions.LOAD_INFO_SUCCESS,
            payload:data
        };
    }
}

pet-tag.reducer.ts

import { Action } from '@ngrx/store';
import { Observable } from 'rxjs/Observable';
import { PettagActions } from '../action/pet-tag.actions';

export function petTagReducer(state:any,action:Action){
    switch(action.type){

        case PettagActions.LOAD_DATA_SUCCESS:{

            return action.payload;
        }

        // case PettagActions.LOAD_INFO_SUCCESS:{

        //     return action.payload;
        // }

        default:{

            return state;
        }
    }
}

export function infoReducer(state:any,action:Action){
    switch(action.type){

        case PettagActions.LOAD_INFO_SUCCESS:{

            return action.payload;
        }

        default:{

            return state;
        }
    }
}

 NOTE:Action中定義了我們期望狀態如何發生改變   Reducer實現了狀態具體如何改變

Action與Store之間添加ngrx/Effect   實現action非同步請求與store處理結果間的解耦

pet-tag.effect.ts

import { Injectable } from '@angular/core';
import { Effect,Actions } from '@ngrx/effects';
import { PettagActions } from '../action/pet-tag.actions';
import { PettagService }  from '../service/pet-tag.service';

@Injectable()
export class PettagEffect {

    constructor(
        private action$:Actions,
        private pettagAction:PettagActions,
        private service:PettagService
    ){}


    @Effect() loadData=this.action$
                .ofType(PettagActions.LOAD_DATA)
                .switchMap(()=>this.service.getData())
                .map(data=>this.pettagAction.loadDtaSuccess(data))

    
    @Effect() loadInfo=this.action$
                .ofType(PettagActions.LOAD_INFO)
                .switchMap(()=>this.service.getInfo())
                .map(data=>this.pettagAction.loadInfoSuccess(data));
}

 

 

4.修改demopet.module.ts 添加 ngrx支持

import { StoreModule } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';
import { PettagActions } from './action/pet-tag.actions';
import { petTagReducer,infoReducer } from './reducer/pet-tag.reducer';
import { PettagEffect } from './effect/pet-tag.effect';
@NgModule({
  declarations: [
    DemoPetComponent,
  ],
  imports: [
    CommonModule,
    FormsModule,
    RouterModule.forChild(routes),
    //here new added
    StoreModule.provideStore({
      pet:petTagReducer,
      info:infoReducer
    }),
    EffectsModule.run(PettagEffect)
  ],
  providers: [
    PettagActions,
    PettagService
  ]
})
export class DemoPetModule {  }

 

5.調用ngrx實現數據列表獲取與單個詳細信息獲取

demopet.component.ts

import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core';
import { Observable } from "rxjs";
import { Store } from '@ngrx/store';
import { Subscription } from 'rxjs/Subscription';
import { HttpService } from '../shared/services/http/http.service';
import { PetTag } from './model/pet-tag.model';
import { PettagActions } from './action/pet-tag.actions';

@Component({
  selector: 'demo-pet',
  styleUrls: ['./demopet.scss'],
  templateUrl: './demopet.html'
})
export class DemoPetComponent {

  private sub: Subscription;
  public dataArr: any;
  public dataItem: any;
  public language: string = 'en';
  public param = {value: 'world'};

  constructor(
    private store: Store<PetTag>,
    private action: PettagActions
  ) {

    this.dataArr = store.select('pet');
  }

  ngOnInit() {

    this.store.dispatch(this.action.loadData());
  }

  ngOnDestroy() {

    this.sub.unsubscribe();
  }

  info() {

    console.log('info');
    this.dataItem = this.store.select('info');
    this.store.dispatch(this.action.loadInfo());
  }

}

demopet.html

<h1>Demo</h1>



<pre>
   <ul>
        <li *ngFor="let d of dataArr | async"> 
            DEMO :  {{ d.msg }}
            <button (click)="info()">info</button>
        </li>
    </ul>

    {{ dataItem | async | json }}

    <h1 *ngFor="let d of dataItem | async"> {{ d.msg }} </h1>
</pre>

 

6.運行效果

初始化時候獲取數據列表

 

 點擊info按鈕  獲取詳細詳細

 

7.以上代碼是從項目中取出的部分代碼,其中涉及到HttpService需要自己封裝,data.json demo.json兩個測試用的json文件,名字隨便取的當時。

http.service.ts

import { Inject, Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions, URLSearchParams } from '@angular/http';
import { Observable } from "rxjs";
import 'rxjs/add/operator/map';
import 'rxjs/operator/delay';
import 'rxjs/operator/mergeMap';
import 'rxjs/operator/switchMap';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
import { handleError } from './handleError';
import { rootPath } from './http.config';

@Injectable()
export class HttpService {

    private _root: string="";

    constructor(private http: Http) {

        this._root=rootPath;
    }

    public get(url: string, data: Map<string, any>, root: string = this._root): Observable<any> {
        if (root == null) root = this._root;
        
        let params = new URLSearchParams();
        if (!!data) {
            data.forEach(function (v, k) {
                params.set(k, v);
            });
       
        }
        return this.http.get(root + url, { search: params })
                        .map((resp: Response) => resp.json())
                        .catch(handleError);
    }



}

 

8.模塊源代碼  下載

 

9.我的微信公眾號。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 概述 1.什麼是重載? 利用形參區分同一個類中多個同名方法的機制叫做重載。 2.什麼是重寫? 子類繼承父類,重寫父類方法的過程叫做重寫。 二 對比 1.發生範圍 重寫發生在父類與子類之間,涉及兩個類,重載發生在同一個類內部。 2.約束 重寫 重載 重載正是根據方法的形參來區分同名的方法,所以同名 ...
  • Java中的集合框架(中) 由於Java中的集合框架的內容比較多,在這裡分為三個部分介紹Java的集合框架,內容是從淺到深,如果已經有java基礎的小伙伴可以直接跳到<淺入深出之Java集合框架(下)>。 目 錄 淺入深出之Java集合框架(上) 淺入深出之Java集合框架(中) 淺入深出之Java ...
  • Descriptions: Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate ...
  • 環境: python2.7 ComsenzXP自帶MySQL 安裝python-MySQL模塊 數據格式:txt格式的賬號信息。 數據一行一條數據。 難點:有的行只有賬號,沒有密碼;有的為空行;有的行首行尾有三連引號;有的空行;有的不是賬號密碼信息。 代碼實現: ...
  • 一、java中的序列化 當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進位序列的形式傳送。發送方需要把這個Java對象轉換為位元組序列,才能在網路上傳送;接收方則需要把位元組序列再恢復為Java對象。把Java對象轉換為位元組序列的過程稱為對象的序列化。把位元組序列恢 ...
  • 一、管道流 演示:PipedInputStream , PipedOutputStream 註意:管道流本身就不建議在一個線程中使用,這是因為向輸出流中寫的數據,都會存到輸入流內部的一個1024位元組大小的數組中,如果寫的內容超過這個數組的大小,而且沒有被輸入流讀取的話,輸出流所在的線程就會等待,如果 ...
  • MyBatis介面的簡單實現原理 用過MyBatis3的人可能會覺得為什麼MyBatis的Mapper介面沒有實現類,但是可以直接用? 那是因為MyBatis使用Java動態代理實現的介面。 這裡僅僅舉個簡單例子來說明原理,不是完全針對MyBatis的,這種思想我們也可以應用在其他地方。 定義一個接 ...
  • 我在工作的時候,在測試環境下使用的資料庫跟生產環境的資料庫不一致,當我們的測試環境下的資料庫完成測試準備更新到生產環境上的資料庫時候,需要準備更新腳本,真是一不小心沒記下來就會忘了改了哪裡,哪裡添加了什麼,這個真是非常讓人頭疼。因此我就試著用Python來實現自動的生成更新腳本,以免我這爛記性,記不 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...