0

我有一项具有此功能的服务

getCurrentUserPermissions() {
    return JSON.parse(localStorage.getItem('currentUserPermissions'));
}

现在我创建一个指令来显示和隐藏菜单

*hasPermissions="['stations','users']"

指示

import {Directive, Input, TemplateRef, ViewContainerRef} from '@angular/core';
import {SiteService} from "../services/site.service";

@Directive({selector: '[hasPermissions]'})
export class HasPermissionsDirective {

@Input("hasPermissions") conditions: string[];

constructor(private templateRef: TemplateRef<any>,
            private viewContainer: ViewContainerRef,
            private siteService: SiteService
) {
}

ngOnInit() {
    let BreakException = {};
    let result: boolean = true;
    let currentUserPermissions = this.siteService.getCurrentUserPermissions();

    try {
        this.conditions.forEach(function (keyCondition) {
            if (currentUserPermissions[keyCondition] !== true) {
                result = false;
                throw BreakException;
            }
        });
    } catch (e) {
        if (e !== BreakException) throw e;
    }

    if (result) {
        this.viewContainer.createEmbeddedView(this.templateRef);
    } else {
        this.viewContainer.clear();
    }
}
}

如何查看 this.siteService.getCurrentUserPermissions() 的更改?因为现在我必须刷新页面才能重新渲染指令才能工作,如果我更改权限

4

1 回答 1

0

简而言之:

无法观看本地存储。

然而,你可以做一些事情:

  • 使用额外的角度服务层访问 localStorage
  • 钩入localStorage.setItem()

如果您可以控制整个应用程序代码,我认为第一个选项是最优雅的。如果您需要的信息是由其他代码使用选项 2 设置的。例如:

const set$ = new Subject<any[]>();
const _setItem = localStorage.setItem;
localStorage.setItem = function(...args){
  set$.next(args);
  _setItem(...args);
}

/* filter for actions on 'currentUserPermissions' and map to the actual data */ 
const currentUserPermissions$ = set$
  .filter(([key, item]) => key === 'currentUserPermissions')
  .map(([key, item]) => item)

这将 localStorage.setItem 替换为一个新函数,该函数将函数参数推送到 Subject,然后使用数据调用实际的 localStorage.setItem。这是一个非常幼稚的实现,您可能需要进行一些错误检查,因为 setItem 可能会多次抛出。

于 2017-07-23T19:54:40.393 回答