加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular – ngrx store 4选择不工作

发布时间:2020-12-17 06:49:31 所属栏目:安全 来源:网络整理
导读:我整天都在努力让我的Angular应用程序与ngrx / store 4一起工作.经过多次不成功的工作,我决定创建一个新的绝对最小应用程序来检查我是否还有其他问题.但最小的应用程序根本不工作:( 在Chrome Redux devtools中我可以看到,商店已正确更新.但UI未更新.此外,app
我整天都在努力让我的Angular应用程序与ngrx / store 4一起工作.经过多次不成功的工作,我决定创建一个新的绝对最小应用程序来检查我是否还有其他问题.但最小的应用程序根本不工作:(

在Chrome Redux devtools中我可以看到,商店已正确更新.但UI未更新.此外,app.component.ts(this.age $.subscribe(console.log))中的日志语句永远不会执行.我真的不知道我错过了什么.

这是相关的代码.

的package.json

{
  "dependencies": {
    "@angular/animations": "^4.2.4","@angular/common": "^4.2.4","@angular/compiler": "^4.2.4","@angular/core": "^4.2.4","@angular/forms": "^4.2.4","@angular/http": "^4.2.4","@angular/platform-browser": "^4.2.4","@angular/platform-browser-dynamic": "^4.2.4","@angular/router": "^4.2.4","@ngrx/store": "^4.0.2","@ngrx/store-devtools": "^4.0.0","rxjs": "^5.4.2","zone.js": "^0.8.14"
  },"devDependencies": {
    "@types/node": "^8.0.22","typescript": "^2.4.2"
  }
}

app.module.ts

import { AppState } from './state';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { StoreModule } from '@ngrx/store';
import { StoreDevtoolsModule } from '@ngrx/store-devtools'
import { reducer } from './reducer';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],imports: [
    BrowserModule,StoreModule.forRoot({ reducer }),StoreDevtoolsModule.instrument(),],providers: [],bootstrap: [AppComponent]
})
export class AppModule { }

state.ts

export interface AppState {
  age: number
}

export const INITIAL_STATE: AppState = {
  age: 1
}

actions.ts

import { Action } from '@ngrx/store';

export const ACTION_TYPE = 'CHANGE_AGE_ACTION';

export class ChangeAgeAction implements Action {
  readonly type: string = ACTION_TYPE;

  constructor(public payload?: number) {
  }
}

reducer.ts

import { ChangeAgeAction } from './actions';
import { Action } from '@ngrx/store';
import { AppState,INITIAL_STATE } from './state';
import { ACTION_TYPE } from './actions';

function changeName(state: AppState,action: ChangeAgeAction): AppState {
  return {
    age: action.payload
  }
}

export function reducer(state: AppState = INITIAL_STATE,action: Action) {
  switch (action.type) {
    case ACTION_TYPE:
      return changeName(state,action);

    default:
      return state;
  }
}

app.component.ts

import { ChangeAgeAction } from './actions';
import { AppState } from './state';
import { Component } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Store } from '@ngrx/store';
import { map } from 'rxjs/operator/map';

@Component({
  selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css']
})
export class AppComponent {
  age$: Observable<number>;

  constructor(private store: Store<AppState>) {
    this.age$= this.store.select<number>(state => state.age);
    this.age$.subscribe(console.log);
  }

  changeAge() {
    this.store.dispatch(new ChangeAgeAction(Math.random()));
  }
}

app.component.html

<h3>Age: {{ age$| async }}</h3>
<button (click)="changeAge()">Change Age</button>

解决方法

您的应用状态未正确建模.实际上有一个包含你的年龄的reducer对象.这是我为使应用程序工作所做的更改:

在state.ts

export interface AppState {
  reducer: {
    age: number
  }
}

在app组件中:

export class AppComponent {
  age$: Observable<number>;

  constructor(private store: Store<AppState>) {
    this.age$= this.store.select<number>(state => state.reducer.age);
    this.age$.subscribe(console.log);
  }

  changeAge() {
    this.store.dispatch(new ChangeAgeAction(Math.random()));
  }
}

请注意,在AppState中有“reducer”对象的原因是因为在设置时执行此操作:StoreModule.forRoot({reducer}).它从reducer获得“reducer”名称.

换句话说,如果您执行类似StoreModule.forRoot({ageReducer})的操作,那么您的应用状态将如下所示:

export interface AppState {
  ageReducer: {
    age: number
  }
}

这是代码的工作版本:

https://stackblitz.com/edit/angular-jxszwh

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读