在ngOnInt

时间:2018-02-23 04:35:14

标签: jhipster

首先让我向所有JHispter开发人员表示感谢,并且这个项目非常棒。

我有一个使用JWT的Jhipster 4.14.0微服务应用程序。

我正在尝试用PrimeNG中的一个替换菜单。

这很好用,但我需要访问

principal.isAuthenticated()

principal.hasAnyAuthority(['ROLE_ADMIN'])

来自ngOnInit或其他加载菜单数据的方式。这总是返回false。我尝试了一些其他的生命周期方法,并且在很多调用之后,principal.isAuthenticated()最终返回true。

ngAfterContentChecked() {
    console.log('ngAfterContentChecked');
    console.log(this.principal.isAuthenticated());
}

当我使用isAuthenticated from html

时,这可以正常工作
<div>{{isAuthenticated()}}</div>

,但我想通过在组件中创建菜单模型来控制菜单,但我无法弄清楚如何正确加载它。

if(!this.isAuthenticated()) {
  this.model.push({ label: 'Sign in', icon: 'fa fa-fw fa-sign-in', command: (onclick)=> {this.login()} });
} else {
  this.model.push({ label: 'Sign out', icon: 'fa fa-fw fa-sign-in', command: (onclick)=> {this.logout()} });
}

我还尝试将以下内容添加到NavbarComponent.ts中的ngOnInit

    this.principal.identity().then((account) => {
        this.currentAccount = account;
    });

,但我在Chrome控制台中收到此错误。

core.js?593e:1440 ERROR TypeError: _this.connectedPromise is not a function
    at eval (tracker.service.ts?aa77:50)
    at eval (webstomp.js?afe9:292)
    at Array.forEach (<anonymous>)
    at SockJS.ws.onmessage (webstomp.js?afe9:284)
    at SockJS.EventTarget.dispatchEvent (eventtarget.js?d62b:51)
    at eval (main.js?8e93:274)
    at Array.forEach (<anonymous>)
    at SockJS._transportMessage (main.js?8e93:272)
    at WebSocketTransport.EventEmitter.emit (emitter.js?a8c1:50)
    at WebSocketTransport.ws.onmessage [as __zone_symbol__ON_PROPERTYmessage] (websocket.js?a354:35)
defaultErrorLogger @ core.js?593e:1440
ErrorHandler.handleError @ core.js?593e:1501
next @ core.js?593e:5481
schedulerFn @ core.js?593e:4319
SafeSubscriber.__tryOrUnsub @ Subscriber.js?3959:240
SafeSubscriber.next @ Subscriber.js?3959:187
Subscriber._next @ Subscriber.js?3959:128
Subscriber.next @ Subscriber.js?3959:92
Subject.next @ Subject.js?8398:56
EventEmitter.emit @ core.js?593e:4299
(anonymous) @ core.js?593e:4755
ZoneDelegate.invoke @ zone.js?6524:388
Zone.run @ zone.js?6524:138
NgZone.runOutsideAngular @ core.js?593e:4681
onHandleError @ core.js?593e:4755
ZoneDelegate.handleError @ zone.js?6524:392
Zone.runTask @ zone.js?6524:191
ZoneTask.invokeTask @ zone.js?6524:495
invokeTask @ zone.js?6524:1536
globalZoneAwareCallback @ zone.js?6524:1562

如果在应用程序首次加载时如何根据身份验证或角色正确加载菜单,将非常感谢任何建议。菜单工作正常,否则。

1 个答案:

答案 0 :(得分:0)

我也想知道这是否适用于生产版本。 setTimeout方法没有在生成版本中等待。

int[] numbers = ListEditText.Text.Split(',').Select(x => int.Parse(x)).ToArray();
var combinations = GetKCombs(numbers, 2);
stringCombinations = combinations.Select(j => j.ToString()).Aggregate((x, y) => x + "," + y);

到目前为止,我唯一能够开展工作的是在ngOninit中使用setInterval。我继续轮询以查看用户是否经过身份验证,然后加载菜单并清除间隔。

List<string> stringCombinations = new List<string>();
for (int i = 0; i < numbers.Count(); i++)
 {
      combinations = GetKCombs(numbers, i + 1).Select(c => string.Join(",", c));     
stringCombinations.AddRange(combinations);                            
 }

这对我来说似乎是一种破坏,我觉得必须有更好的方法。也许创建一个观察校长的菜单服务?如果有人有我的想法,请告诉我。