[英]Angular 8 bind ngrx state to component
我是 Angular 的新手,我想将 HTML 中的一些类名绑定到我所在州的一些值。 起初我只有一个状态,它只是一些布尔值,一切正常。 现在我将状态更改为一个对象,以便我可以在其中保存更多信息。 虽然我使用的方法或多或少与以前相同,但类名没有改变。 状态确实发生了变化。 有人可以告诉我我的错误是什么,如果有另一种更合适的方法来做我想做的事情,也请告诉我。
角度版本是 8.2.14。
这是我的代码:
减速器.ts:
export type ShoppinCartState = {
CartIsOpen: boolean;
};
export type HamburgerState = {
MenuIsOpen: boolean;
};
export function hamburgerReducer(
state: HamburgerState = { MenuIsOpen: false },
action: Action
) {
switch (action.type) {
case "HAMBURGER.TOGGLE":
console.log("HAMBURGER.Toggle called " + state.MenuIsOpen);
return {
...state,
MenuIsOpen: !state.MenuIsOpen
};
case "HAMBURGER.CLOSE":
return {
...state,
MenuIsOpen: false
};
case "HAMBURGER.OPEN":
return {
...state,
MenuIsOpen: true
};
default:
return state;
}
}
export function shoppingCartReducer(
state: ShoppinCartState = { CartIsOpen: false },
action: Action
) {
switch (action.type) {
case "CART.TOGGLE":
console.log("Tooggle cart called " + state.CartIsOpen);
return {
...state,
CartIsOpen: !state.CartIsOpen
};
default:
return state;
}
}
这是我的组件。 当用户点击汉堡图标时,会发送一个改变状态的动作。 还有另一部分与国家有关。 当值为真时,类名应该是“可见的”。
<app-hamburger-icon (click)="onHamburgerIconClick()"></app-hamburger-icon>
<div id="Logo"><a (click)="onLinkClick()" routerLink="/">E99-EsAns</a></div>
<ul [ngClass]="{ visible: hamburgerClicked$ | async }">
这就是 component.ts 文件
import { Store } from "@ngrx/store";
import { Observable } from "rxjs";
import { HamburgerState } from "src/app/reducer";
@Component({
selector: "app-navigationbar",
templateUrl: "./navigationbar.component.html",
styleUrls: ["./navigationbar.component.css"]
})
export class NavigationbarComponent implements OnInit {
hamburgerClicked$: Observable<boolean>;
constructor(private store: Store<HamburgerState>) {
this.hamburgerClicked$ = this.store.select("MenuIsOpen");
}
ngOnInit() {}
onHamburgerIconClick() {
console.log(this.hamburgerClicked$);
this.store.dispatch({ type: "HAMBURGER.TOGGLE" });
}
onLinkClick() {
this.store.dispatch({ type: "HAMBURGER.CLOSE" });
}
onShoppingCartIconClicked() {
this.store.dispatch({ type: "CART.TOGGLE" });
}
}
我的 app.module.ts 的一些片段
import { hamburgerReducer, shoppingCartReducer } from "./reducer";
...
...
...
imports: [
BrowserModule,
BrowserAnimationsModule,
AppRoutingModule,
HttpClientModule,
StoreModule.forRoot({
hamburgerReducer: hamburgerReducer,
shoppingCartReducer: shoppingCartReducer
})
],
当您将Store
注入组件时,您对全局状态的结构进行操作。 所以选择必须“选择”到这个结构中才能访问正确的对象。
只有reducer 函数得到了这个全局状态的一部分。 我们可以在app.module.ts
中看到您定义商店的最有可能的app.module.ts
:
StoreModule.forRoot({
hamburgerReducer: hamburgerReducer,
shoppingCartReducer: shoppingCartReducer
})
最佳实践是创建一个接口State
来描述您的商店结构:
export interface State {
hamburgerReducer: HamburgerState;
shoppingCartReducer: ShoppingCartState;
}
然后在注入 store 时使用这个接口:
constructor(private store: Store<State>)
然后您可以通过以下方式选择汉堡菜单状态:
this.store.select(state => state.hamburgerReducer.MenuIsOpen)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.