Angular 2 Dart : How to share variables between parent with router and child components?

标签 angular dart angular-dart angular-components angular2-dart

如果有一个带有路由器的子组件并通过绑定(bind)更新它们,我该如何共享变量?

这是我的(部分)代码:

app_component.dart:

import 'package:angular2/core.dart';
import 'package:angular2_components/angular2_components.dart';
import 'package:angular2/router.dart';

import 'package:my_app/profile_component/profile_component.dart';
import 'package:my_app/login_component/login_component.dart';

@Component(
  selector: 'my-app',
  styleUrls: const ['app_component.css'],
  templateUrl: 'app_component.html',
  directives: const [
    ROUTER_DIRECTIVES,
    materialDirectives,
    LoginComponent,
    ProfileComponent
  ],
  providers: const [
    ROUTER_PROVIDERS,
    const Provider(LocationStrategy, useClass: HashLocationStrategy),
    materialProviders
  ],
)
@RouteConfig(const [
  const Route(path: 'home', name: 'Home', component: HomeComponent, useAsDefault: true),
  const Route(path: 'profile', name: "User Profile", component: ProfileComponent)
])
class AppComponent {

  @ViewChild('login')
  LoginComponent loginComponent;
  @ViewChild('profile')
  ProfileComponent profileComponent;

  bool get isUserLoggedIn => loginComponent.isUserLoggedIn;

}

app_component.html:

<nav>
    <ul>
    <li *ngIf="!isUserLoggedIn">
        <a (click)="loginComponent.loginOpen=true">Account / Login</a>
    </li>
    <li *ngIf="isUserLoggedIn">
        <a id="mb_logout" (click)="loginComponent.logUserOut()">Logout</a>
    </li>
    <li *ngIf="isUserLoggedIn">
        <a id="mb_profile"  [routerLink]="['User Profile']">Zum Profil</a>
    </li>
    </ul>
</nav>

login_component.dart:

...
bool get isUserLoggedIn => _isUserLoggedIn();
...

profile_component.dart:

import 'package:angular2/core.dart';
import 'package:angular2_components/angular2_components.dart';

@Component(
  selector: 'profile',
  styleUrls: const ['profile_component.css'],
  templateUrl: 'profile_component.html',
  directives: const [materialDirectives],
  providers: const [materialProviders],
)
class ProfileComponent {

  @Input()
  bool isUserLoggedIn;

  ProfileComponent() {
    print(isUserLoggedIn);
  }
}

简而言之,我想从 ProfileComponent 中访问 isUserLoggedIn 的当前值。我怎样才能做到这一点?

最佳答案

在父组件上提供共享服务

@Injectable()
class SharedService {
  bool _isUserLoggedIn = false;
  bool get isUserLoggedIn => _isUserLoggedIn;
  set isUserLoggedIn(bool value) {
    _isUserLoggedIn = value ?? false;
    _isUserLoggedInController.add(_isUserLoggedIn);
  }

  StreamController<bool> _isUserLoggedInController;
  Stream<bool> get onIsUserLoggedIn => _isUserLoggedInController.stream;


  SharedService() {
     _isUserLoggedInController = new StreamController<bool>.broadcast(
       onListen: () => _isUserLoggedInController.add(_isUserLoggedIn)
     );
  }
}

在要更新的组件中使用或更新状态注入(inject)服务

@Component(
  ...,
  template: '''
    <div>isLoggedIn: {{sharedService.onIsUserLoggedIn | async}}</div>
    <button (click)="toggleIsUserLoggedIn()">{{(sharedService.onIsUserLoggedIn | async) ? 'log out' : 'log in'}}</div>
  ''',
)
class SomeComponent {
  final SharedService sharedService;
  SomeComponent(this.sharedService);

  toggleIsUserLoggedIn() {
    sharedService.isUserLoggedIn = !sharedService.isUserLoggedIn;
  }
}

AppComponent中提供服务

@Component(
  selector: 'my-app',
  providers: const [SharedService],
)
class AppComponent {}

关于 Angular 2 Dart : How to share variables between parent with router and child components?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43804629/

相关文章:

flutter - 如何打印字符的表示形式而不是符号

dart - 如何在AngularDart中使用ngAfterChanges

javascript - 为什么 typescript 忽略变量类型?

javascript - Angular 2 - 获取表单控件验证器

Angular 2 事件发射器与主题

drop-down-menu - 从第一个下拉列表的值获取第二个下拉列表

javascript - Dart Canvas 不绘制图像

dart - 如何基于组件调用模板中的函数?

flutter - 我如何让我的系统将webdev识别为命令?

angular - 命令 "npm run build -- --prod"退出并出现代码 1 错误