【问题标题】:How to remove local storage if the component is other than the current component - angular如果组件不是当前组件,如何删除本地存储 - 角度
【发布时间】:2019-10-29 05:25:33
【问题描述】:

我有两个页面,1. x-dashboard 页面 2. y-dashboard 页面。 x-dashboard 有一个表格组件 y-dashoard 也有一个包含不同数据的表格组件。

现在,我创建了一个通用过滤器组件,当用户单击 x 或 y 页面内的过滤器图标时,我将在基于表格列的弹出窗口中动态显示过滤器选项。

用户输入一些过滤器并单击应用后,我将把过滤器值存储在本地存储中(逻辑在过滤器组件内部),并根据订阅者在相应页面(x 或 y 页面)内访问该值。

当您使用链接从 xpage 导航到 ypage 时,我正在清除 ngdestroy 上的本地存储密钥。这样下一页就不会从本地存储中获取相同的过滤器参数。

但是当我输入 url(通过路由导航)时,ngdestroy 没有调用,并且 x 页面中的 localstorage(过滤参数)设置显示在 y 页面中。

如果我清除页面加载,那么当用户刷新时,他将丢失过滤的参数。这个问题怎么解决?

【问题讨论】:

  • 为什么不同时存储它们?
  • @HarunYılmaz 是的,我做到了。现在,问题是,当我从 y 仪表板导航到 x 仪表板时,先前存储的值仍然存在,并且默认情况下正在应用过滤器,这是错误的。我想清除有关组件更改的数据。
  • 然后你可以这样做:清除 y 的 ngOnInit 上的 x 值,并清除 x 的 ngOnInit 上的 y
  • 如果我有 x, y, z, p, q, r。会很复杂
  • 你认为它为什么会很复杂?或者你可以只放一个像lastPage 这样的属性,而只有一条记录,如果该属性不匹配,那么重置它?

标签: angular components


【解决方案1】:

您可以向保存在 localStorage 中的对象(过滤器对象)添加另一个属性,例如 page: 'pageY' 或 page: 'pageX',然后在 ngOnLoad() 中检查当前页面是否匹配该属性,你使用它,否则你删除它。

【讨论】:

  • 我保留了最后的选项 :) 。我想维护一个键,这样我就不需要告诉过滤器组件有关父页面的信息。如果我使用菜单路由器链接导航(执行 ngDestroy() - 删除 LStorage 的逻辑),所有工作正常。但是,当我更改 URL 中的路由器路径时,ngDestroy() 不会调用。我遵循的任何错误方法?
  • 当你改变 URL 中的路由路径时,Angular 会根据路由决定是否重新创建页面。如果您正在导航到相同的路线(即使使用不同的参数),它将保持不变并且不会调用 ngOnDestroy()。一种解决方案是订阅 ActivatedRoute.queryParams Observable,这样每次该页面中的 URL 更改时您都会收到通知。请参阅此问题的解决方案:stackoverflow.com/questions/46969864/…
  • 我没有导航到同一条路线,我正在从 abc/x-route-name 导航到 abc/y-route-name
  • 我从 server/abc/x-route-name 导航到 abc/y-route-name('abc' 很常见)
  • 正如你所建议的那样,我做了同样的事情,但现在的问题是,当我从 y 仪表板导航到 x 仪表板时,以前存储的 x 仪表板值仍然存在,并且默认情况下应用过滤器,这是错误的。我想清除有关组件更改的数据。 – Abhi 刚刚编辑删除
【解决方案2】:

您可以为每个组件设置一个键,该键的作用类似于存储在localStorage 中的数据的标识符。并在每个组件的ngOnInit,检查标识符是否与组件相同。

我在这里创建了一个堆栈闪电战:https://stackblitz.com/edit/angular-oryk5z

首先,我为要存储在localStorage 中的项目创建了一个模型:

export class LocalStorageItem{
  last_component: string;
  id: number;
  row: number;
  whatever: string;

  static fromJSON = (jsonValue: string): LocalStorageItem => {

    const newItem = new LocalStorageItem();
    if(jsonValue !== null){
      const parsedJSON = JSON.parse(jsonValue);
      newItem.last_component = parsedJSON['last_component'];
      newItem.id = parsedJSON['id'];
      newItem.row = parsedJSON['row'];
      newItem.whatever = parsedJSON['whatever'];
    }
    return newItem;
  }

}

然后我创建了一个负责存储操作的服务。在initLocalStorage() 方法中,该服务将组件的标识符作为参数,并检查存储项的标识符是否相同。如果没有,它会创建一个带有标识符的新项目。

export class LocalStorageService {

  readonly filterStorageKey = 'component_storage_key'

  constructor() { }

  initLocalStorage = (storageKey: string) => {

    var storedItem = LocalStorageItem.fromJSON(localStorage.getItem(this.filterStorageKey));



    if (storedItem === null || (storedItem.last_component !== storageKey)) { // if no value is stored / store is empty
      const newStoreItem = new LocalStorageItem();
      newStoreItem.last_component = storageKey;
      this.setLocalStorage(newStoreItem);

    }
    storedItem = LocalStorageItem.fromJSON(localStorage.getItem(this.filterStorageKey)); // this line is for debug purposes
    return storedItem;

  }

  getLocalStorage = () => {
    return LocalStorageItem.fromJSON(localStorage.getItem(this.filterStorageKey));
  }

  setLocalStorage = (item: LocalStorageItem) =>{
    localStorage.setItem(this.filterStorageKey, JSON.stringify(item));
  }

}

然后在每个组件中,使用该组件的存储标识符在ngOnInit 调用initLocalStorage() 服务方法:

export class YDashboardComponent implements OnInit, ILocalStorageManager { // This interface is to be sure that the component defines storageKey property

  readonly storageKey = 'y-dashboard';
  storedItemFromService;
  constructor(private localStorageService: LocalStorageService) { }

  ngOnInit() {
    this.storedItemFromService = this.localStorageService.initLocalStorage(this.storageKey);
  }

}

我希望这将为您提供有关您要构建的内容的线索。

【讨论】:

  • 感谢您的帖子。我会在我的项目中尝试并让你知道。有点忙于其他工作。
  • 如果我从 X 导航到 Y 并从 Y 导航到 X,不应该有任何存储变量,因为它是全新的页面。所以,我应该清除过滤器,在您的解决方案中,在我导航到 Y 仪表板时设置 X 键并返回仍然显示 x 键,我觉得这是错误的。我希望数据在页面刷新时保持不变(提供相同的路由刷新 F5)。 2.一旦我从X页面转到Y页面并再次回到x页面,那么本地存储不应该在那里。因为用户导航到另一个页面。
  • 1- 当你去路由到一个组件时,如果标识符不同,它会在存储中创建一个空项目。如果你 F5 刷新,存储保持不变。 2-如果标识符不同,它将清除存储。上面的代码应该适用于这两种情况。您可以使用我提供的 stackblitz 链接中的代码,并检查它是否适合您的需求。如果有不清楚的地方,请随时提问。
  • 抱歉拖了这个,但我真的很困惑。我打开了您的堆栈闪电战,单击 X 仪表板按钮 => 存储在本地存储键中的值 => 现在单击 Y 仪表板 => 在本地存储中设置的 Y 存储键 => 现在当我回到 x 仪表板时(通过 url .../x-dashboard) 那么 X 存储键应该是空的吧?而不是它显示本地存储值。这是错误的
  • 我们继续讨论this chat room的问题:)
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 2020-01-26
  • 2018-01-25
  • 2021-07-21
  • 1970-01-01
  • 2014-03-23
  • 2016-07-03
  • 2016-08-21
相关资源
最近更新 更多