使用Angular2服务作为指令(对于ngIf)

时间:2016-03-27 10:41:14

标签: angular

我正在尝试根据用户是否登录(我的用户服务中的导出参数)更改Angular2中导航栏组件的行为。我刚设置isLoggedIn为此返回true。很遗憾,该链接不会显示为:

  

angular2.js:23730 EXCEPTION:在UserService上找不到指令注释

我在应用程序的其他地方使用UserService作为常规服务,我是否可以将其作为指令使用,而不会干扰其他任何功能?

nav.component.ts:

import { Component } from 'angular2/core';
import { RouteConfig, ROUTER_DIRECTIVES } from 'angular2/router';

import { UserService } from '../user/services/user.service';

@Component({
  selector: 'nav-bar',
  template: `
  <div class="nav">
    <a [routerLink]="['LoginComponent']" *ngIf="UserService.isLoggedIn">Login</a>
  </div>
  `,
  styleUrls: ['client/dev/todo/styles/todo.css'],
  directives: [ROUTER_DIRECTIVES, UserService],
  providers: [  ]
})

export class NavComponent {}

user.service.ts

import { Injectable, Inject } from 'angular2/core';
import { Headers, Http } from 'angular2/http';

@Injectable()
export class UserService {
  private loggedIn = false;

  constructor(@Inject(Http) private _http: Http) {
    this.loggedIn = !!localStorage.getItem('auth_token');
  }

  isLoggedIn() {
    //return this.loggedIn;
    return true;
  }
}

更新:

另外,如果我将服务移动到提供者而不是指令,那么该组件根本不会显示,错误:

  

EXCEPTION:TypeError:无法读取属性&#39; isLoggedIn&#39;在NavComponent @ 2:41中的[UserService.isLoggedIn]中未定义

所以我似乎无法引用该属性?

1 个答案:

答案 0 :(得分:1)

您已在directives媒体资源中注入服务,因此需要@Component@Directive

directives: [ROUTER_DIRECTIVES, UserService], // <<< Not good! Remove it from there!

您必须注入providers属性

providers : [UserService] /// Good!

修改

所以你的问题更像是我可以使用服务作为指令吗?,答案是否定的。您必须使用@Component@Directive对您的服务进行注释,届时它将不再是一项简单的服务。