Попытка сделать условный рендеринг по состоянию ngrx - PullRequest
0 голосов
/ 18 февраля 2020

Я начал использовать ngrx в своем приложении пару дней go, и мне удалось составить список продуктов, указав c Модель. Смотрите файл ts:

export class ProductsComponent implements OnInit {
  products: Observable<Product[]>;
  constructor(private store: Store<AppState>, private ps: ProductsService) {
    this.products = store.select("product");
  }

ngOnInit(): void {
    this.ps
      .getProducts()
      .subscribe(data =>
        data.forEach(product => this.store.dispatch(new GetProducts(product)))
      );
  }
}

html:

<div class="right" *ngIf="products">
  <h3>Tutorials</h3>
  <ul>
    <li *ngFor="let product of products | async">
      <a target="_blank">{{ product.name }}</a>
    </li>
  </ul>
</div>

Как вы можете видеть, элемент li имеет массив для l oop over products, рендеринг объектов (продуктов).

Сейчас я пытаюсь сделать условный рендеринг с помощью логического состояния, когда пользователь вошел в систему.

Это модель:

export interface isLogged {
  logged: boolean;
}

Действия:

import { Injectable } from "@angular/core";
import { Action } from "@ngrx/store";
import { isLogged } from "../models/isLogged.mode";

export const SET_LOGGED = "[ISLOGGED] SET_LOGGED";
export const REMOVE_TUTORIAL = "[PRODUCT] Remove";

export class Set_Logged implements Action {
  readonly type = SET_LOGGED;

  constructor(public payload) {}
}

export type Actions = Set_Logged;

Редуктор:

import { Action } from "@ngrx/store";
import { isLogged } from "../models/isLogged.mode";
import * as loggedActions from "../actions/isLogged.actions";

const initialState = false;

export function isLoggedReducer(
  state = initialState,
  action: loggedActions.Actions
) {
  switch (action.type) {
    case loggedActions.SET_LOGGED:
      console.log(state);
      return action.payload;
    default:
      return state;
  }
}

Состояние приложения:

export interface LogState {
  readonly isLogged;
}

Этот компонент:

import { isLogged } from "../../models/isLogged.mode";
import { Set_Logged } from "../../actions/isLogged.actions";
import { LogState } from "../../app.state";

export class LoginPageComponent implements OnInit {
isLogged: Observable<isLogged>;

constructor(private store: Store<LogState>){
this.isLogged = store.select("isLogged");
}
ngOnInit() {
    this.store.dispatch(new Set_Logged(true));
  }
}

HTML условный рендеринг:

<div *ngIf="isLogged">You are logged.</div>

Я попытался установить переменную isLogged в состояние хранения так же, как я делал с продуктами, но не с массивом, но он продолжает отображать div на странице , Когда я пытаюсь console.log(this.isLogged) он регистрирует объект хранилища отверстий, а не состояние. Почему это работает с продуктами, а не когда я пытаюсь получить логическое состояние? Моя цель - визуализировать <div *ngIf="isLogged">You are logged.</div> только тогда, когда состояние isLogged истинно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...